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.
Files changed (522) hide show
  1. package/README.md +6 -11
  2. package/lib/commands/access/add.d.ts +14 -0
  3. package/lib/commands/access/add.js +55 -0
  4. package/lib/commands/access/index.d.ts +11 -0
  5. package/lib/commands/access/index.js +86 -0
  6. package/lib/commands/access/remove.d.ts +12 -0
  7. package/lib/commands/access/remove.js +25 -0
  8. package/lib/commands/access/update.d.ts +14 -0
  9. package/lib/commands/access/update.js +39 -0
  10. package/lib/commands/addons/attach.d.ts +16 -0
  11. package/lib/commands/addons/attach.js +51 -0
  12. package/lib/commands/addons/create.d.ts +19 -0
  13. package/lib/commands/addons/create.js +84 -0
  14. package/lib/commands/addons/destroy.d.ts +19 -0
  15. package/lib/commands/addons/destroy.js +61 -0
  16. package/lib/commands/addons/detach.d.ts +13 -0
  17. package/lib/commands/addons/detach.js +31 -0
  18. package/lib/commands/addons/docs.d.ts +14 -0
  19. package/lib/commands/addons/docs.js +36 -0
  20. package/lib/commands/addons/index.d.ts +16 -0
  21. package/lib/commands/addons/index.js +246 -0
  22. package/lib/commands/addons/info.d.ts +14 -0
  23. package/lib/commands/addons/info.js +44 -0
  24. package/lib/commands/addons/open.d.ts +75 -0
  25. package/lib/commands/addons/open.js +87 -0
  26. package/lib/commands/addons/plans.d.ts +12 -0
  27. package/lib/commands/addons/plans.js +47 -0
  28. package/lib/commands/addons/rename.d.ts +10 -0
  29. package/lib/commands/addons/rename.js +20 -0
  30. package/lib/commands/addons/services.d.ts +9 -0
  31. package/lib/commands/addons/services.js +34 -0
  32. package/lib/commands/addons/upgrade.d.ts +28 -0
  33. package/lib/commands/addons/upgrade.js +145 -0
  34. package/lib/commands/addons/wait.d.ts +14 -0
  35. package/lib/commands/addons/wait.js +70 -0
  36. package/lib/commands/apps/create.d.ts +2 -2
  37. package/lib/commands/apps/create.js +13 -6
  38. package/lib/commands/apps/destroy.d.ts +2 -1
  39. package/lib/commands/apps/destroy.js +4 -3
  40. package/lib/commands/apps/errors.d.ts +1 -0
  41. package/lib/commands/apps/errors.js +1 -0
  42. package/lib/commands/apps/favorites/add.d.ts +1 -0
  43. package/lib/commands/apps/favorites/add.js +1 -0
  44. package/lib/commands/apps/favorites/remove.d.ts +1 -0
  45. package/lib/commands/apps/favorites/remove.js +1 -0
  46. package/lib/commands/apps/index.d.ts +1 -1
  47. package/lib/commands/apps/index.js +1 -1
  48. package/lib/commands/apps/info.d.ts +2 -1
  49. package/lib/commands/apps/info.js +3 -4
  50. package/lib/commands/apps/join.d.ts +11 -0
  51. package/lib/commands/apps/join.js +25 -0
  52. package/lib/commands/apps/leave.d.ts +12 -0
  53. package/lib/commands/apps/leave.js +25 -0
  54. package/lib/commands/apps/lock.d.ts +11 -0
  55. package/lib/commands/apps/lock.js +30 -0
  56. package/lib/commands/apps/open.d.ts +2 -1
  57. package/lib/commands/apps/open.js +2 -1
  58. package/lib/commands/apps/rename.d.ts +2 -1
  59. package/lib/commands/apps/rename.js +2 -1
  60. package/lib/commands/apps/stacks/index.d.ts +2 -1
  61. package/lib/commands/apps/stacks/index.js +2 -1
  62. package/lib/commands/apps/stacks/set.d.ts +1 -1
  63. package/lib/commands/apps/stacks/set.js +1 -1
  64. package/lib/commands/apps/transfer.d.ts +17 -0
  65. package/lib/commands/apps/transfer.js +91 -0
  66. package/lib/commands/apps/unlock.d.ts +11 -0
  67. package/lib/commands/apps/unlock.js +30 -0
  68. package/lib/commands/auth/token.js +2 -1
  69. package/lib/commands/authorizations/create.js +5 -1
  70. package/lib/commands/authorizations/info.js +5 -1
  71. package/lib/commands/authorizations/revoke.js +5 -1
  72. package/lib/commands/authorizations/rotate.js +5 -1
  73. package/lib/commands/authorizations/update.js +5 -1
  74. package/lib/commands/autocomplete/doctor.js +2 -2
  75. package/lib/commands/autocomplete/options.js +2 -2
  76. package/lib/commands/certs/add.d.ts +16 -0
  77. package/lib/commands/certs/add.js +98 -0
  78. package/lib/commands/certs/auto/disable.d.ts +11 -0
  79. package/lib/commands/certs/auto/disable.js +34 -0
  80. package/lib/commands/certs/auto/enable.d.ts +11 -0
  81. package/lib/commands/certs/auto/enable.js +51 -0
  82. package/lib/commands/certs/auto/index.d.ts +12 -0
  83. package/lib/commands/certs/auto/index.js +94 -0
  84. package/lib/commands/certs/auto/refresh.d.ts +10 -0
  85. package/lib/commands/certs/auto/refresh.js +19 -0
  86. package/lib/commands/certs/generate.d.ts +26 -0
  87. package/lib/commands/certs/generate.js +111 -0
  88. package/lib/commands/certs/index.d.ts +10 -0
  89. package/lib/commands/certs/index.js +26 -0
  90. package/lib/commands/certs/info.d.ts +13 -0
  91. package/lib/commands/certs/info.js +43 -0
  92. package/lib/commands/certs/remove.d.ts +13 -0
  93. package/lib/commands/certs/remove.js +32 -0
  94. package/lib/commands/certs/update.d.ts +18 -0
  95. package/lib/commands/certs/update.js +54 -0
  96. package/lib/commands/ci/config/get.d.ts +1 -0
  97. package/lib/commands/ci/config/get.js +1 -0
  98. package/lib/commands/ci/config/set.d.ts +1 -0
  99. package/lib/commands/ci/config/set.js +1 -0
  100. package/lib/commands/ci/config/unset.d.ts +1 -0
  101. package/lib/commands/ci/config/unset.js +1 -0
  102. package/lib/commands/ci/index.d.ts +1 -0
  103. package/lib/commands/ci/index.js +1 -0
  104. package/lib/commands/ci/info.d.ts +1 -0
  105. package/lib/commands/ci/info.js +1 -0
  106. package/lib/commands/ci/last.d.ts +1 -0
  107. package/lib/commands/ci/last.js +1 -0
  108. package/lib/commands/ci/open.d.ts +1 -0
  109. package/lib/commands/ci/open.js +1 -0
  110. package/lib/commands/ci/rerun.d.ts +1 -0
  111. package/lib/commands/ci/rerun.js +1 -0
  112. package/lib/commands/config/set.d.ts +2 -1
  113. package/lib/commands/config/set.js +2 -1
  114. package/lib/commands/container/index.d.ts +6 -0
  115. package/lib/commands/container/index.js +13 -0
  116. package/lib/commands/container/login.d.ts +9 -0
  117. package/lib/commands/container/login.js +57 -0
  118. package/lib/commands/container/logout.d.ts +9 -0
  119. package/lib/commands/container/logout.js +37 -0
  120. package/lib/commands/container/pull.d.ts +14 -0
  121. package/lib/commands/container/pull.js +40 -0
  122. package/lib/commands/container/push.d.ts +16 -0
  123. package/lib/commands/container/push.js +101 -0
  124. package/lib/commands/container/release.d.ts +14 -0
  125. package/lib/commands/container/release.js +89 -0
  126. package/lib/commands/container/rm.d.ts +13 -0
  127. package/lib/commands/container/rm.js +36 -0
  128. package/lib/commands/container/run.d.ts +15 -0
  129. package/lib/commands/container/run.js +63 -0
  130. package/lib/commands/dashboard.d.ts +7 -0
  131. package/lib/commands/dashboard.js +164 -0
  132. package/lib/commands/domains/index.d.ts +2 -2
  133. package/lib/commands/drains/add.d.ts +1 -0
  134. package/lib/commands/drains/add.js +1 -0
  135. package/lib/commands/drains/index.d.ts +1 -0
  136. package/lib/commands/drains/index.js +1 -0
  137. package/lib/commands/drains/remove.d.ts +1 -0
  138. package/lib/commands/drains/remove.js +1 -0
  139. package/lib/commands/features/disable.d.ts +12 -0
  140. package/lib/commands/features/disable.js +30 -0
  141. package/lib/commands/features/enable.d.ts +12 -0
  142. package/lib/commands/features/enable.js +29 -0
  143. package/lib/commands/features/index.d.ts +10 -0
  144. package/lib/commands/features/index.js +37 -0
  145. package/lib/commands/features/info.d.ts +13 -0
  146. package/lib/commands/features/info.js +33 -0
  147. package/lib/commands/keys/add.d.ts +14 -0
  148. package/lib/commands/keys/add.js +101 -0
  149. package/lib/commands/keys/clear.d.ts +5 -0
  150. package/lib/commands/keys/clear.js +17 -0
  151. package/lib/commands/keys/index.d.ts +9 -0
  152. package/lib/commands/keys/index.js +36 -0
  153. package/lib/commands/keys/remove.d.ts +9 -0
  154. package/lib/commands/keys/remove.js +29 -0
  155. package/lib/commands/labs/enable.d.ts +13 -0
  156. package/lib/commands/labs/enable.js +47 -0
  157. package/lib/commands/labs/index.d.ts +11 -0
  158. package/lib/commands/labs/index.js +71 -0
  159. package/lib/commands/labs/info.d.ts +14 -0
  160. package/lib/commands/labs/info.js +49 -0
  161. package/lib/commands/local/index.d.ts +1 -1
  162. package/lib/commands/local/index.js +8 -3
  163. package/lib/commands/local/run.d.ts +1 -1
  164. package/lib/commands/local/run.js +8 -3
  165. package/lib/commands/maintenance/index.d.ts +10 -0
  166. package/lib/commands/maintenance/index.js +19 -0
  167. package/lib/commands/maintenance/off.d.ts +10 -0
  168. package/lib/commands/maintenance/off.js +20 -0
  169. package/lib/commands/maintenance/on.d.ts +10 -0
  170. package/lib/commands/maintenance/on.js +20 -0
  171. package/lib/commands/members/add.d.ts +13 -0
  172. package/lib/commands/members/add.js +33 -0
  173. package/lib/commands/members/index.d.ts +12 -0
  174. package/lib/commands/members/index.js +76 -0
  175. package/lib/commands/members/remove.d.ts +10 -0
  176. package/lib/commands/members/remove.js +58 -0
  177. package/lib/commands/members/set.d.ts +11 -0
  178. package/lib/commands/members/set.js +21 -0
  179. package/lib/commands/notifications/index.d.ts +13 -0
  180. package/lib/commands/notifications/index.js +62 -0
  181. package/lib/commands/orgs/index.d.ts +11 -0
  182. package/lib/commands/orgs/index.js +27 -0
  183. package/lib/commands/orgs/open.d.ts +10 -0
  184. package/lib/commands/orgs/open.js +24 -0
  185. package/lib/commands/pg/backups/cancel.d.ts +15 -0
  186. package/lib/commands/pg/backups/cancel.js +49 -0
  187. package/lib/commands/pg/backups/capture.d.ts +15 -0
  188. package/lib/commands/pg/backups/capture.js +65 -0
  189. package/lib/commands/pg/backups/delete.d.ts +15 -0
  190. package/lib/commands/pg/backups/delete.js +38 -0
  191. package/lib/commands/pg/backups/download.d.ts +14 -0
  192. package/lib/commands/pg/backups/download.js +58 -0
  193. package/lib/commands/pg/backups/index.d.ts +20 -0
  194. package/lib/commands/pg/backups/index.js +129 -0
  195. package/lib/commands/pg/backups/info.d.ts +17 -0
  196. package/lib/commands/pg/backups/info.js +92 -0
  197. package/lib/commands/pg/backups/restore.d.ts +19 -0
  198. package/lib/commands/pg/backups/restore.js +107 -0
  199. package/lib/commands/pg/backups/schedule.d.ts +21 -0
  200. package/lib/commands/pg/backups/schedule.js +82 -0
  201. package/lib/commands/pg/backups/schedules.d.ts +10 -0
  202. package/lib/commands/pg/backups/schedules.js +31 -0
  203. package/lib/commands/pg/backups/unschedule.d.ts +13 -0
  204. package/lib/commands/pg/backups/unschedule.js +44 -0
  205. package/lib/commands/pg/backups/url.d.ts +13 -0
  206. package/lib/commands/pg/backups/url.js +41 -0
  207. package/lib/commands/pg/bloat.d.ts +13 -0
  208. package/lib/commands/pg/bloat.js +87 -0
  209. package/lib/commands/pg/blocking.d.ts +13 -0
  210. package/lib/commands/pg/blocking.js +42 -0
  211. package/lib/commands/pg/connection-pooling/attach.d.ts +15 -0
  212. package/lib/commands/pg/connection-pooling/attach.js +41 -0
  213. package/lib/commands/pg/copy.d.ts +18 -0
  214. package/lib/commands/pg/copy.js +86 -0
  215. package/lib/commands/pg/credentials/create.d.ts +14 -0
  216. package/lib/commands/pg/credentials/create.js +40 -0
  217. package/lib/commands/pg/credentials/destroy.d.ts +16 -0
  218. package/lib/commands/pg/credentials/destroy.js +48 -0
  219. package/lib/commands/pg/credentials/repair-default.d.ts +15 -0
  220. package/lib/commands/pg/credentials/repair-default.js +39 -0
  221. package/lib/commands/pg/credentials/rotate.d.ts +16 -0
  222. package/lib/commands/pg/credentials/rotate.js +82 -0
  223. package/lib/commands/pg/credentials/url.d.ts +14 -0
  224. package/lib/commands/pg/credentials/url.js +64 -0
  225. package/lib/commands/pg/credentials.d.ts +16 -0
  226. package/lib/commands/pg/credentials.js +61 -0
  227. package/lib/commands/pg/diagnose.d.ts +18 -0
  228. package/lib/commands/pg/diagnose.js +109 -0
  229. package/lib/commands/pg/info.d.ts +14 -0
  230. package/lib/commands/pg/info.js +92 -0
  231. package/lib/commands/pg/kill.d.ts +15 -0
  232. package/lib/commands/pg/kill.js +32 -0
  233. package/lib/commands/pg/killall.d.ts +13 -0
  234. package/lib/commands/pg/killall.js +26 -0
  235. package/lib/commands/pg/links/create.d.ts +15 -0
  236. package/lib/commands/pg/links/create.js +58 -0
  237. package/lib/commands/pg/links/destroy.d.ts +16 -0
  238. package/lib/commands/pg/links/destroy.js +42 -0
  239. package/lib/commands/pg/links/index.d.ts +13 -0
  240. package/lib/commands/pg/links/index.js +59 -0
  241. package/lib/commands/pg/locks.d.ts +15 -0
  242. package/lib/commands/pg/locks.js +53 -0
  243. package/lib/commands/pg/maintenance/index.d.ts +13 -0
  244. package/lib/commands/pg/maintenance/index.js +29 -0
  245. package/lib/commands/pg/maintenance/run.d.ts +14 -0
  246. package/lib/commands/pg/maintenance/run.js +37 -0
  247. package/lib/commands/pg/maintenance/window.d.ts +15 -0
  248. package/lib/commands/pg/maintenance/window.js +41 -0
  249. package/lib/commands/pg/outliers.d.ts +19 -0
  250. package/lib/commands/pg/outliers.js +97 -0
  251. package/lib/commands/pg/promote.d.ts +14 -0
  252. package/lib/commands/pg/promote.js +169 -0
  253. package/lib/commands/pg/ps.d.ts +14 -0
  254. package/lib/commands/pg/ps.js +52 -0
  255. package/lib/commands/pg/psql.d.ts +16 -0
  256. package/lib/commands/pg/psql.js +49 -0
  257. package/lib/commands/pg/pull.d.ts +18 -0
  258. package/lib/commands/pg/pull.js +87 -0
  259. package/lib/commands/pg/push.d.ts +18 -0
  260. package/lib/commands/pg/push.js +84 -0
  261. package/lib/commands/pg/reset.d.ts +15 -0
  262. package/lib/commands/pg/reset.js +44 -0
  263. package/lib/commands/pg/settings/auto-explain/log-analyze.d.ts +13 -0
  264. package/lib/commands/pg/settings/auto-explain/log-analyze.js +32 -0
  265. package/lib/commands/pg/settings/auto-explain/log-buffers.d.ts +13 -0
  266. package/lib/commands/pg/settings/auto-explain/log-buffers.js +30 -0
  267. package/lib/commands/pg/settings/auto-explain/log-min-duration.d.ts +16 -0
  268. package/lib/commands/pg/settings/auto-explain/log-min-duration.js +33 -0
  269. package/lib/commands/pg/settings/auto-explain/log-nested-statements.d.ts +12 -0
  270. package/lib/commands/pg/settings/auto-explain/log-nested-statements.js +25 -0
  271. package/lib/commands/pg/settings/auto-explain/log-triggers.d.ts +13 -0
  272. package/lib/commands/pg/settings/auto-explain/log-triggers.js +30 -0
  273. package/lib/commands/pg/settings/auto-explain/log-verbose.d.ts +17 -0
  274. package/lib/commands/pg/settings/auto-explain/log-verbose.js +33 -0
  275. package/lib/commands/pg/settings/auto-explain.d.ts +18 -0
  276. package/lib/commands/pg/settings/auto-explain.js +38 -0
  277. package/lib/commands/pg/settings/index.d.ts +13 -0
  278. package/lib/commands/pg/settings/index.js +34 -0
  279. package/lib/commands/pg/settings/log-connections.d.ts +17 -0
  280. package/lib/commands/pg/settings/log-connections.js +34 -0
  281. package/lib/commands/pg/settings/log-lock-waits.d.ts +13 -0
  282. package/lib/commands/pg/settings/log-lock-waits.js +31 -0
  283. package/lib/commands/pg/settings/log-min-duration-statement.d.ts +15 -0
  284. package/lib/commands/pg/settings/log-min-duration-statement.js +33 -0
  285. package/lib/commands/pg/settings/log-statement.d.ts +12 -0
  286. package/lib/commands/pg/settings/log-statement.js +30 -0
  287. package/lib/commands/pg/settings/track-functions.d.ts +12 -0
  288. package/lib/commands/pg/settings/track-functions.js +29 -0
  289. package/lib/commands/pg/unfollow.d.ts +14 -0
  290. package/lib/commands/pg/unfollow.js +40 -0
  291. package/lib/commands/pg/upgrade.d.ts +15 -0
  292. package/lib/commands/pg/upgrade.js +58 -0
  293. package/lib/commands/pg/vacuum-stats.d.ts +13 -0
  294. package/lib/commands/pg/vacuum-stats.js +65 -0
  295. package/lib/commands/pg/wait.d.ts +15 -0
  296. package/lib/commands/pg/wait.js +79 -0
  297. package/lib/commands/pipelines/connect.js +1 -1
  298. package/lib/commands/pipelines/diff.js +1 -1
  299. package/lib/commands/ps/index.d.ts +15 -0
  300. package/lib/commands/ps/index.js +195 -0
  301. package/lib/commands/ps/restart.d.ts +17 -0
  302. package/lib/commands/ps/restart.js +38 -0
  303. package/lib/commands/ps/scale.d.ts +13 -0
  304. package/lib/commands/ps/scale.js +108 -0
  305. package/lib/commands/ps/stop.d.ts +17 -0
  306. package/lib/commands/ps/stop.js +33 -0
  307. package/lib/commands/ps/type.d.ts +12 -0
  308. package/lib/commands/ps/type.js +163 -0
  309. package/lib/commands/redis/cli.d.ts +15 -0
  310. package/lib/commands/redis/cli.js +204 -0
  311. package/lib/commands/redis/credentials.d.ts +14 -0
  312. package/lib/commands/redis/credentials.js +32 -0
  313. package/lib/commands/redis/info.d.ts +15 -0
  314. package/lib/commands/redis/info.js +25 -0
  315. package/lib/commands/redis/keyspace-notifications.d.ts +14 -0
  316. package/lib/commands/redis/keyspace-notifications.js +47 -0
  317. package/lib/commands/redis/maintenance.d.ts +16 -0
  318. package/lib/commands/redis/maintenance.js +63 -0
  319. package/lib/commands/redis/maxmemory.d.ts +14 -0
  320. package/lib/commands/redis/maxmemory.js +40 -0
  321. package/lib/commands/redis/promote.d.ts +13 -0
  322. package/lib/commands/redis/promote.js +39 -0
  323. package/lib/commands/redis/stats-reset.d.ts +14 -0
  324. package/lib/commands/redis/stats-reset.js +36 -0
  325. package/lib/commands/redis/timeout.d.ts +14 -0
  326. package/lib/commands/redis/timeout.js +35 -0
  327. package/lib/commands/redis/upgrade.d.ts +15 -0
  328. package/lib/commands/redis/upgrade.js +37 -0
  329. package/lib/commands/redis/wait.d.ts +14 -0
  330. package/lib/commands/redis/wait.js +60 -0
  331. package/lib/commands/releases/index.d.ts +14 -0
  332. package/lib/commands/releases/index.js +124 -0
  333. package/lib/commands/releases/info.d.ts +15 -0
  334. package/lib/commands/releases/info.js +56 -0
  335. package/lib/commands/releases/output.d.ts +13 -0
  336. package/lib/commands/releases/output.js +37 -0
  337. package/lib/commands/releases/rollback.d.ts +14 -0
  338. package/lib/commands/releases/rollback.js +48 -0
  339. package/lib/commands/run/detached.d.ts +7 -8
  340. package/lib/commands/run/detached.js +16 -20
  341. package/lib/commands/run/index.d.ts +10 -11
  342. package/lib/commands/run/index.js +16 -17
  343. package/lib/commands/run/inside.d.ts +5 -7
  344. package/lib/commands/run/inside.js +10 -14
  345. package/lib/commands/spaces/create.d.ts +22 -0
  346. package/lib/commands/spaces/create.js +73 -0
  347. package/lib/commands/spaces/destroy.d.ts +14 -0
  348. package/lib/commands/spaces/destroy.js +49 -0
  349. package/lib/commands/spaces/drains/get.d.ts +12 -0
  350. package/lib/commands/spaces/drains/get.js +27 -0
  351. package/lib/commands/spaces/drains/set.d.ts +14 -0
  352. package/lib/commands/spaces/drains/set.js +29 -0
  353. package/lib/commands/spaces/hosts.d.ts +14 -0
  354. package/lib/commands/spaces/hosts.js +37 -0
  355. package/lib/commands/spaces/index.d.ts +16 -0
  356. package/lib/commands/spaces/index.js +55 -0
  357. package/lib/commands/spaces/info.d.ts +14 -0
  358. package/lib/commands/spaces/info.js +47 -0
  359. package/lib/commands/spaces/outbound-rules/add.d.ts +15 -0
  360. package/lib/commands/spaces/outbound-rules/add.js +81 -0
  361. package/lib/commands/spaces/outbound-rules/index.d.ts +15 -0
  362. package/lib/commands/spaces/outbound-rules/index.js +49 -0
  363. package/lib/commands/spaces/outbound-rules/remove.d.ts +17 -0
  364. package/lib/commands/spaces/outbound-rules/remove.js +53 -0
  365. package/lib/commands/spaces/peerings/accept.d.ts +15 -0
  366. package/lib/commands/spaces/peerings/accept.js +36 -0
  367. package/lib/commands/spaces/peerings/destroy.d.ts +15 -0
  368. package/lib/commands/spaces/peerings/destroy.js +45 -0
  369. package/lib/commands/spaces/peerings/index.d.ts +13 -0
  370. package/lib/commands/spaces/peerings/index.js +33 -0
  371. package/lib/commands/spaces/peerings/info.d.ts +15 -0
  372. package/lib/commands/spaces/peerings/info.js +59 -0
  373. package/lib/commands/spaces/ps.d.ts +15 -0
  374. package/lib/commands/spaces/ps.js +82 -0
  375. package/lib/commands/spaces/rename.d.ts +11 -0
  376. package/lib/commands/spaces/rename.js +26 -0
  377. package/lib/commands/spaces/topology.d.ts +32 -0
  378. package/lib/commands/spaces/topology.js +89 -0
  379. package/lib/commands/spaces/transfer.d.ts +11 -0
  380. package/lib/commands/spaces/transfer.js +35 -0
  381. package/lib/commands/spaces/trusted-ips/add.d.ts +16 -0
  382. package/lib/commands/spaces/trusted-ips/add.js +43 -0
  383. package/lib/commands/spaces/trusted-ips/index.d.ts +15 -0
  384. package/lib/commands/spaces/trusted-ips/index.js +52 -0
  385. package/lib/commands/spaces/trusted-ips/remove.d.ts +15 -0
  386. package/lib/commands/spaces/trusted-ips/remove.js +44 -0
  387. package/lib/commands/spaces/vpn/config.d.ts +14 -0
  388. package/lib/commands/spaces/vpn/config.js +54 -0
  389. package/lib/commands/spaces/vpn/connect.d.ts +15 -0
  390. package/lib/commands/spaces/vpn/connect.js +45 -0
  391. package/lib/commands/spaces/vpn/connections.d.ts +17 -0
  392. package/lib/commands/spaces/vpn/connections.js +57 -0
  393. package/lib/commands/spaces/vpn/destroy.d.ts +14 -0
  394. package/lib/commands/spaces/vpn/destroy.js +35 -0
  395. package/lib/commands/spaces/vpn/info.d.ts +16 -0
  396. package/lib/commands/spaces/vpn/info.js +82 -0
  397. package/lib/commands/spaces/vpn/update.d.ts +14 -0
  398. package/lib/commands/spaces/vpn/update.js +36 -0
  399. package/lib/commands/spaces/vpn/wait.d.ts +13 -0
  400. package/lib/commands/spaces/vpn/wait.js +53 -0
  401. package/lib/commands/spaces/wait.d.ts +17 -0
  402. package/lib/commands/spaces/wait.js +89 -0
  403. package/lib/commands/status.js +4 -4
  404. package/lib/commands/teams/index.d.ts +9 -0
  405. package/lib/commands/teams/index.js +29 -0
  406. package/lib/global_telemetry.js +10 -4
  407. package/lib/hooks/postrun/performance_analytics.js +5 -4
  408. package/lib/hooks/prerun/analytics.js +3 -0
  409. package/lib/lib/addons/addons_wait.d.ts +78 -0
  410. package/lib/lib/addons/addons_wait.js +56 -0
  411. package/lib/lib/addons/create_addon.d.ts +7 -0
  412. package/lib/lib/addons/create_addon.js +59 -0
  413. package/lib/lib/addons/destroy_addon.d.ts +3 -0
  414. package/lib/lib/addons/destroy_addon.js +48 -0
  415. package/lib/lib/addons/resolve.d.ts +38 -0
  416. package/lib/lib/addons/resolve.js +179 -0
  417. package/lib/lib/addons/util.d.ts +9 -0
  418. package/lib/lib/addons/util.js +72 -0
  419. package/lib/lib/apps/app-transfer.d.ts +10 -0
  420. package/lib/lib/apps/app-transfer.js +35 -0
  421. package/lib/lib/autocomplete/completions.d.ts +4 -0
  422. package/lib/lib/autocomplete/completions.js +6 -1
  423. package/lib/lib/certs/certificate_details.d.ts +2 -0
  424. package/lib/lib/certs/certificate_details.js +37 -0
  425. package/lib/lib/certs/display_table.d.ts +2 -0
  426. package/lib/lib/certs/display_table.js +51 -0
  427. package/lib/lib/certs/domains.d.ts +3 -0
  428. package/lib/lib/certs/domains.js +45 -0
  429. package/lib/lib/certs/flags.d.ts +7 -0
  430. package/lib/lib/certs/flags.js +42 -0
  431. package/lib/lib/certs/format_date.d.ts +1 -0
  432. package/lib/lib/certs/format_date.js +11 -0
  433. package/lib/lib/certs/get_cert_and_key.d.ts +9 -0
  434. package/lib/lib/certs/get_cert_and_key.js +11 -0
  435. package/lib/lib/ci/interfaces/kolkrabbi.d.ts +1 -1
  436. package/lib/lib/ci/source.js +3 -3
  437. package/lib/lib/ci/test-run.js +2 -2
  438. package/lib/lib/config/quote.js +1 -1
  439. package/lib/lib/confirmCommand.d.ts +1 -0
  440. package/lib/lib/{apps/confirm-app.js → confirmCommand.js} +2 -2
  441. package/lib/lib/container/debug.d.ts +2 -0
  442. package/lib/lib/container/debug.js +5 -0
  443. package/lib/lib/container/docker_helper.d.ts +24 -0
  444. package/lib/lib/container/docker_helper.js +168 -0
  445. package/lib/lib/container/streamer.d.ts +1 -0
  446. package/lib/lib/container/streamer.js +31 -0
  447. package/lib/lib/domains/domains.d.ts +6 -0
  448. package/lib/lib/domains/domains.js +104 -0
  449. package/lib/lib/local/run-foreman.d.ts +1 -0
  450. package/lib/lib/local/run-foreman.js +229 -1
  451. package/lib/lib/members/util.d.ts +3 -0
  452. package/lib/lib/members/util.js +25 -0
  453. package/lib/lib/members/utils.d.ts +2 -0
  454. package/lib/lib/members/utils.js +14 -0
  455. package/lib/lib/notify.d.ts +1 -0
  456. package/lib/lib/notify.js +23 -0
  457. package/lib/lib/orgs/utils.d.ts +5 -0
  458. package/lib/lib/orgs/utils.js +24 -0
  459. package/lib/lib/pg/backups.d.ts +17 -0
  460. package/lib/lib/pg/backups.js +164 -0
  461. package/lib/lib/pg/bastion.d.ts +29 -0
  462. package/lib/lib/pg/bastion.js +121 -0
  463. package/lib/lib/pg/config.d.ts +2 -0
  464. package/lib/lib/pg/config.js +13 -0
  465. package/lib/lib/pg/download.d.ts +5 -0
  466. package/lib/lib/pg/download.js +34 -0
  467. package/lib/lib/pg/fetcher.d.ts +39 -0
  468. package/lib/lib/pg/fetcher.js +137 -0
  469. package/lib/lib/pg/host.d.ts +1 -0
  470. package/lib/lib/pg/host.js +7 -0
  471. package/lib/lib/pg/psql.d.ts +48 -0
  472. package/lib/lib/pg/psql.js +252 -0
  473. package/lib/lib/pg/push_pull.d.ts +13 -0
  474. package/lib/lib/pg/push_pull.js +118 -0
  475. package/lib/lib/pg/setter.d.ts +16 -0
  476. package/lib/lib/pg/setter.js +65 -0
  477. package/lib/lib/pg/types.d.ts +230 -0
  478. package/lib/lib/pg/types.js +2 -0
  479. package/lib/lib/pg/util.d.ts +36 -0
  480. package/lib/lib/pg/util.js +183 -0
  481. package/lib/lib/redis/api.d.ts +65 -0
  482. package/lib/lib/redis/api.js +122 -0
  483. package/lib/lib/releases/output.d.ts +1 -0
  484. package/lib/lib/releases/output.js +14 -0
  485. package/lib/lib/releases/releases.d.ts +6 -0
  486. package/lib/lib/releases/releases.js +32 -0
  487. package/lib/lib/releases/status_helper.d.ts +5 -0
  488. package/lib/lib/releases/status_helper.js +25 -0
  489. package/lib/lib/run/dyno.js +2 -2
  490. package/lib/lib/run/log-displayer.d.ts +1 -1
  491. package/lib/lib/spaces/format.d.ts +4 -0
  492. package/lib/lib/spaces/format.js +60 -0
  493. package/lib/lib/spaces/hosts.d.ts +9 -0
  494. package/lib/lib/spaces/hosts.js +34 -0
  495. package/lib/lib/spaces/outbound-rules.d.ts +4 -0
  496. package/lib/lib/spaces/outbound-rules.js +78 -0
  497. package/lib/lib/spaces/parsers.d.ts +8 -0
  498. package/lib/lib/spaces/parsers.js +17 -0
  499. package/lib/lib/spaces/peering.d.ts +4 -0
  500. package/lib/lib/spaces/peering.js +53 -0
  501. package/lib/lib/spaces/spaces.d.ts +4 -0
  502. package/lib/lib/spaces/spaces.js +37 -0
  503. package/lib/lib/spaces/vpn-connections.d.ts +2 -0
  504. package/lib/lib/spaces/vpn-connections.js +22 -0
  505. package/lib/lib/teamUtils.d.ts +3 -0
  506. package/lib/lib/teamUtils.js +18 -0
  507. package/lib/lib/time.d.ts +2 -0
  508. package/lib/lib/time.js +29 -0
  509. package/lib/lib/types/app_errors.d.ts +6 -0
  510. package/lib/lib/types/app_errors.js +2 -0
  511. package/lib/lib/types/domain.d.ts +61 -0
  512. package/lib/lib/types/domain.js +5 -0
  513. package/lib/lib/types/notifications.d.ts +20 -0
  514. package/lib/lib/types/notifications.js +2 -0
  515. package/lib/lib/utils/multisort.d.ts +32 -0
  516. package/lib/lib/utils/multisort.js +66 -0
  517. package/lib/lib/utils/uuid-validate.d.ts +1 -0
  518. package/lib/lib/utils/uuid-validate.js +7 -0
  519. package/lib/user-config.js +2 -2
  520. package/oclif.manifest.json +12776 -3097
  521. package/package.json +110 -63
  522. 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
+ }