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