heroku 10.0.0-alpha.1 → 10.0.0-beta.0

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 (159) hide show
  1. package/lib/commands/access/add.js +1 -1
  2. package/lib/commands/access/index.js +2 -1
  3. package/lib/commands/access/update.js +1 -1
  4. package/lib/commands/addons/attach.js +1 -1
  5. package/lib/commands/addons/create.js +18 -1
  6. package/lib/commands/addons/destroy.js +1 -1
  7. package/lib/commands/addons/detach.js +1 -1
  8. package/lib/commands/addons/docs.js +1 -1
  9. package/lib/commands/addons/info.js +1 -1
  10. package/lib/commands/addons/open.js +1 -1
  11. package/lib/commands/addons/plans.js +1 -1
  12. package/lib/commands/addons/rename.js +2 -2
  13. package/lib/commands/addons/upgrade.js +2 -2
  14. package/lib/commands/addons/wait.js +1 -1
  15. package/lib/commands/apps/open.js +1 -1
  16. package/lib/commands/apps/rename.js +1 -1
  17. package/lib/commands/apps/stacks/set.js +1 -1
  18. package/lib/commands/authorizations/info.js +1 -1
  19. package/lib/commands/authorizations/revoke.js +1 -1
  20. package/lib/commands/authorizations/rotate.js +1 -1
  21. package/lib/commands/authorizations/update.js +1 -1
  22. package/lib/commands/buildpacks/index.js +9 -3
  23. package/lib/commands/certs/add.js +2 -2
  24. package/lib/commands/certs/generate.js +1 -1
  25. package/lib/commands/certs/update.js +2 -2
  26. package/lib/commands/ci/config/get.js +1 -1
  27. package/lib/commands/ci/info.js +1 -1
  28. package/lib/commands/ci/rerun.js +1 -1
  29. package/lib/commands/clients/create.js +2 -2
  30. package/lib/commands/clients/destroy.js +1 -1
  31. package/lib/commands/clients/info.js +1 -1
  32. package/lib/commands/clients/rotate.js +1 -1
  33. package/lib/commands/clients/update.js +1 -1
  34. package/lib/commands/config/get.js +1 -1
  35. package/lib/commands/domains/add.js +1 -1
  36. package/lib/commands/domains/info.js +1 -1
  37. package/lib/commands/domains/remove.js +1 -1
  38. package/lib/commands/domains/update.js +1 -1
  39. package/lib/commands/domains/wait.js +1 -1
  40. package/lib/commands/drains/add.js +1 -1
  41. package/lib/commands/drains/remove.js +1 -1
  42. package/lib/commands/features/disable.js +1 -1
  43. package/lib/commands/features/enable.js +1 -1
  44. package/lib/commands/features/info.js +1 -1
  45. package/lib/commands/git/credentials.js +1 -1
  46. package/lib/commands/keys/add.js +1 -1
  47. package/lib/commands/keys/remove.js +1 -1
  48. package/lib/commands/labs/disable.js +1 -1
  49. package/lib/commands/labs/enable.js +1 -1
  50. package/lib/commands/labs/info.js +1 -1
  51. package/lib/commands/local/index.js +1 -1
  52. package/lib/commands/members/add.js +1 -1
  53. package/lib/commands/pg/backups/cancel.js +1 -1
  54. package/lib/commands/pg/backups/capture.js +2 -1
  55. package/lib/commands/pg/backups/delete.js +1 -1
  56. package/lib/commands/pg/backups/download.js +1 -1
  57. package/lib/commands/pg/backups/info.js +1 -1
  58. package/lib/commands/pg/backups/restore.d.ts +1 -0
  59. package/lib/commands/pg/backups/restore.js +29 -2
  60. package/lib/commands/pg/backups/schedule.js +2 -1
  61. package/lib/commands/pg/backups/unschedule.js +2 -1
  62. package/lib/commands/pg/backups/url.js +1 -1
  63. package/lib/commands/pg/bloat.js +2 -1
  64. package/lib/commands/pg/blocking.js +2 -1
  65. package/lib/commands/pg/connection-pooling/attach.js +2 -1
  66. package/lib/commands/pg/copy.js +2 -2
  67. package/lib/commands/pg/credentials/create.js +2 -1
  68. package/lib/commands/pg/credentials/destroy.js +2 -1
  69. package/lib/commands/pg/credentials/repair-default.js +2 -1
  70. package/lib/commands/pg/credentials/rotate.js +2 -1
  71. package/lib/commands/pg/credentials/url.js +2 -1
  72. package/lib/commands/pg/credentials.js +2 -1
  73. package/lib/commands/pg/diagnose.js +1 -1
  74. package/lib/commands/pg/info.js +2 -1
  75. package/lib/commands/pg/kill.js +3 -2
  76. package/lib/commands/pg/killall.js +2 -1
  77. package/lib/commands/pg/links/create.js +3 -2
  78. package/lib/commands/pg/links/destroy.js +3 -2
  79. package/lib/commands/pg/links/index.js +2 -1
  80. package/lib/commands/pg/locks.js +2 -1
  81. package/lib/commands/pg/maintenance/index.js +2 -1
  82. package/lib/commands/pg/maintenance/run.js +2 -1
  83. package/lib/commands/pg/maintenance/window.js +3 -2
  84. package/lib/commands/pg/outliers.js +2 -1
  85. package/lib/commands/pg/promote.js +2 -1
  86. package/lib/commands/pg/ps.js +2 -1
  87. package/lib/commands/pg/psql.js +2 -1
  88. package/lib/commands/pg/pull.js +3 -2
  89. package/lib/commands/pg/push.js +4 -3
  90. package/lib/commands/pg/reset.js +2 -1
  91. package/lib/commands/pg/settings/auto-explain/log-analyze.js +3 -2
  92. package/lib/commands/pg/settings/auto-explain/log-buffers.js +3 -2
  93. package/lib/commands/pg/settings/auto-explain/log-format.js +3 -2
  94. package/lib/commands/pg/settings/auto-explain/log-min-duration.js +3 -2
  95. package/lib/commands/pg/settings/auto-explain/log-nested-statements.js +3 -2
  96. package/lib/commands/pg/settings/auto-explain/log-triggers.js +3 -2
  97. package/lib/commands/pg/settings/auto-explain/log-verbose.js +3 -2
  98. package/lib/commands/pg/settings/auto-explain.js +3 -2
  99. package/lib/commands/pg/settings/explain-data-connector-details.js +3 -2
  100. package/lib/commands/pg/settings/index.js +2 -1
  101. package/lib/commands/pg/settings/log-connections.js +3 -2
  102. package/lib/commands/pg/settings/log-lock-waits.js +3 -2
  103. package/lib/commands/pg/settings/log-min-duration-statement.js +3 -2
  104. package/lib/commands/pg/settings/log-min-error-statement.js +2 -1
  105. package/lib/commands/pg/settings/log-statement.js +3 -2
  106. package/lib/commands/pg/settings/track-functions.js +3 -2
  107. package/lib/commands/pg/unfollow.js +2 -1
  108. package/lib/commands/pg/upgrade.js +2 -1
  109. package/lib/commands/pg/vacuum-stats.js +2 -1
  110. package/lib/commands/pg/wait.js +2 -1
  111. package/lib/commands/pipelines/diff.d.ts +1 -1
  112. package/lib/commands/pipelines/diff.js +24 -14
  113. package/lib/commands/pipelines/promote.js +1 -1
  114. package/lib/commands/ps/autoscale/enable.js +13 -2
  115. package/lib/commands/ps/index.js +15 -6
  116. package/lib/commands/redis/cli.js +1 -1
  117. package/lib/commands/redis/credentials.js +1 -1
  118. package/lib/commands/redis/info.js +1 -1
  119. package/lib/commands/redis/keyspace-notifications.js +1 -1
  120. package/lib/commands/redis/maintenance.js +1 -1
  121. package/lib/commands/redis/maxmemory.js +1 -1
  122. package/lib/commands/redis/promote.js +1 -1
  123. package/lib/commands/redis/stats-reset.js +1 -1
  124. package/lib/commands/redis/timeout.js +1 -1
  125. package/lib/commands/redis/upgrade.js +1 -1
  126. package/lib/commands/redis/wait.js +1 -1
  127. package/lib/commands/releases/index.js +4 -2
  128. package/lib/commands/releases/info.js +6 -2
  129. package/lib/commands/releases/output.js +1 -1
  130. package/lib/commands/releases/rollback.js +14 -4
  131. package/lib/commands/sessions/destroy.js +1 -1
  132. package/lib/commands/spaces/create.js +1 -1
  133. package/lib/commands/spaces/drains/set.js +1 -1
  134. package/lib/commands/spaces/trusted-ips/add.js +3 -6
  135. package/lib/commands/spaces/trusted-ips/index.js +1 -3
  136. package/lib/commands/spaces/trusted-ips/remove.js +3 -4
  137. package/lib/commands/telemetry/add.d.ts +0 -1
  138. package/lib/commands/telemetry/add.js +1 -2
  139. package/lib/commands/webhooks/deliveries/info.js +1 -1
  140. package/lib/commands/webhooks/events/info.js +1 -1
  141. package/lib/commands/webhooks/info.js +1 -1
  142. package/lib/commands/webhooks/update.js +1 -1
  143. package/lib/lib/api.d.ts +12 -3
  144. package/lib/lib/api.js +15 -14
  145. package/lib/lib/buildpacks/buildpacks.d.ts +2 -4
  146. package/lib/lib/buildpacks/buildpacks.js +37 -8
  147. package/lib/lib/pipelines/ownership.d.ts +3 -2
  148. package/lib/lib/pipelines/render-pipeline.d.ts +2 -1
  149. package/lib/lib/pipelines/render-pipeline.js +6 -6
  150. package/lib/lib/releases/releases.js +10 -3
  151. package/lib/lib/releases/status_helper.d.ts +2 -2
  152. package/lib/lib/releases/status_helper.js +5 -1
  153. package/lib/lib/types/app_process_tier.d.ts +4 -0
  154. package/lib/lib/types/app_process_tier.js +2 -0
  155. package/lib/nls.d.ts +8 -0
  156. package/lib/nls.js +14 -0
  157. package/lib/package.nls.json +6 -0
  158. package/oclif.manifest.json +167 -11
  159. package/package.json +3 -4
@@ -4,6 +4,7 @@ const command_1 = require("@heroku-cli/command");
4
4
  const core_1 = require("@oclif/core");
5
5
  const tsheredoc_1 = require("tsheredoc");
6
6
  const setter_1 = require("../../../lib/pg/setter");
7
+ const nls_1 = require("../../../nls");
7
8
  // ref: https://www.postgresql.org/docs/current/auto-explain.html
8
9
  class AutoExplain extends setter_1.PGSettingsCommand {
9
10
  constructor() {
@@ -32,7 +33,7 @@ AutoExplain.flags = {
32
33
  remote: command_1.flags.remote(),
33
34
  };
34
35
  AutoExplain.args = {
35
- database: core_1.Args.string(),
36
- value: core_1.Args.string(),
36
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
37
+ value: core_1.Args.string({ description: 'boolean indicating if execution plans of queries will be logged for future connections' }),
37
38
  };
38
39
  AutoExplain.strict = false;
@@ -4,6 +4,7 @@ const command_1 = require("@heroku-cli/command");
4
4
  const core_1 = require("@oclif/core");
5
5
  const tsheredoc_1 = require("tsheredoc");
6
6
  const setter_1 = require("../../../lib/pg/setter");
7
+ const nls_1 = require("../../../nls");
7
8
  class ExplainDataConnectorDetails extends setter_1.PGSettingsCommand {
8
9
  constructor() {
9
10
  super(...arguments);
@@ -28,6 +29,6 @@ ExplainDataConnectorDetails.flags = {
28
29
  remote: command_1.flags.remote(),
29
30
  };
30
31
  ExplainDataConnectorDetails.args = {
31
- database: core_1.Args.string(),
32
- value: core_1.Args.string(),
32
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
33
+ value: core_1.Args.string({ description: 'boolean indicating if data replication slot details get logged' }),
33
34
  };
@@ -5,6 +5,7 @@ const core_1 = require("@oclif/core");
5
5
  const resolve_1 = require("../../../lib/addons/resolve");
6
6
  const util_1 = require("../../../lib/pg/util");
7
7
  const host_1 = require("../../../lib/pg/host");
8
+ const nls_1 = require("../../../nls");
8
9
  class Index extends command_1.Command {
9
10
  async run() {
10
11
  const { flags, args } = await this.parse(Index);
@@ -30,5 +31,5 @@ Index.flags = {
30
31
  remote: command_1.flags.remote(),
31
32
  };
32
33
  Index.args = {
33
- database: core_1.Args.string(),
34
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
34
35
  };
@@ -4,6 +4,7 @@ const command_1 = require("@heroku-cli/command");
4
4
  const core_1 = require("@oclif/core");
5
5
  const tsheredoc_1 = require("tsheredoc");
6
6
  const setter_1 = require("../../../lib/pg/setter");
7
+ const nls_1 = require("../../../nls");
7
8
  class LogConnections extends setter_1.PGSettingsCommand {
8
9
  constructor() {
9
10
  super(...arguments);
@@ -29,6 +30,6 @@ LogConnections.flags = {
29
30
  remote: command_1.flags.remote(),
30
31
  };
31
32
  LogConnections.args = {
32
- database: core_1.Args.string(),
33
- value: core_1.Args.string(),
33
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
34
+ value: core_1.Args.string({ description: 'boolean indicating if database login attempts get logged' }),
34
35
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const tsheredoc_1 = require("tsheredoc");
5
5
  const setter_1 = require("../../../lib/pg/setter");
6
+ const nls_1 = require("../../../nls");
6
7
  class LogLockWaits extends setter_1.PGSettingsCommand {
7
8
  constructor() {
8
9
  super(...arguments);
@@ -26,6 +27,6 @@ LogLockWaits.description = (0, tsheredoc_1.default)(`
26
27
  Applications and their query patterns should try to avoid changes to many different tables within the same transaction.
27
28
  `);
28
29
  LogLockWaits.args = {
29
- database: core_1.Args.string(),
30
- value: core_1.Args.string(),
30
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
31
+ value: core_1.Args.string({ description: 'boolean indicating if a message gets logged when a session waits longer than the deadlock_timeout to acquire a lock' }),
31
32
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const tsheredoc_1 = require("tsheredoc");
5
5
  const setter_1 = require("../../../lib/pg/setter");
6
+ const nls_1 = require("../../../nls");
6
7
  class LogMinDurationStatement extends setter_1.PGSettingsCommand {
7
8
  constructor() {
8
9
  super(...arguments);
@@ -28,6 +29,6 @@ LogMinDurationStatement.description = (0, tsheredoc_1.default)(`
28
29
  Setting log_min_duration_statement to zero prints all statement durations and -1 will disable logging statement durations.
29
30
  `);
30
31
  LogMinDurationStatement.args = {
31
- database: core_1.Args.string(),
32
- value: core_1.Args.string(),
32
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
33
+ value: core_1.Args.string({ description: 'milliseconds to wait for a statement to complete before logging it' }),
33
34
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const tsheredoc_1 = require("tsheredoc");
5
5
  const setter_1 = require("../../../lib/pg/setter");
6
+ const nls_1 = require("../../../nls");
6
7
  class LogMinErrorStatement extends setter_1.PGSettingsCommand {
7
8
  constructor() {
8
9
  super(...arguments);
@@ -22,6 +23,6 @@ LogMinErrorStatement.description = (0, tsheredoc_1.default)(`
22
23
  Use this setting to prevent logging SQL queries that contain sensitive information. Default is "error".
23
24
  `);
24
25
  LogMinErrorStatement.args = {
25
- database: core_1.Args.string(),
26
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
26
27
  value: core_1.Args.string({ options: ['error', 'log', 'fatal', 'panic'] }),
27
28
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const tsheredoc_1 = require("tsheredoc");
5
5
  const setter_1 = require("../../../lib/pg/setter");
6
+ const nls_1 = require("../../../nls");
6
7
  class LogStatement extends setter_1.PGSettingsCommand {
7
8
  constructor() {
8
9
  super(...arguments);
@@ -25,6 +26,6 @@ LogStatement.description = (0, tsheredoc_1.default)(`
25
26
  all - All statements are logged
26
27
  `);
27
28
  LogStatement.args = {
28
- database: core_1.Args.string(),
29
- value: core_1.Args.string({ options: ['none', 'ddl', 'mod', 'all'] }),
29
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
30
+ value: core_1.Args.string({ options: ['none', 'ddl', 'mod', 'all'], description: 'type of SQL statements to log\n<options: none|ddl|mod|all>' }),
30
31
  };
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const core_1 = require("@oclif/core");
4
4
  const tsheredoc_1 = require("tsheredoc");
5
5
  const setter_1 = require("../../../lib/pg/setter");
6
+ const nls_1 = require("../../../nls");
6
7
  // ref: https://www.postgresql.org/docs/current/runtime-config-statistics.html#GUC-TRACK-FUNCTIONS
7
8
  class TrackFunctions extends setter_1.PGSettingsCommand {
8
9
  constructor() {
@@ -24,6 +25,6 @@ TrackFunctions.description = (0, tsheredoc_1.default)(`
24
25
  pl - Only procedural language functions are tracked
25
26
  all - All functions, including SQL and C language functions, are tracked. Simple SQL-language that are inlined are not tracked`);
26
27
  TrackFunctions.args = {
27
- database: core_1.Args.string(),
28
- value: core_1.Args.string({ options: ['none', 'pl', 'all'] }),
28
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
29
+ value: core_1.Args.string({ options: ['none', 'pl', 'all'], description: 'function type to track\n<options: none|pl|all>' }),
29
30
  };
@@ -8,6 +8,7 @@ const host_1 = require("../../lib/pg/host");
8
8
  const util_1 = require("../../lib/pg/util");
9
9
  const confirmCommand_1 = require("../../lib/confirmCommand");
10
10
  const tsheredoc_1 = require("tsheredoc");
11
+ const nls_1 = require("../../nls");
11
12
  class Unfollow extends command_1.Command {
12
13
  async run() {
13
14
  const { flags, args } = await this.parse(Unfollow);
@@ -36,5 +37,5 @@ Unfollow.flags = {
36
37
  remote: command_1.flags.remote(),
37
38
  };
38
39
  Unfollow.args = {
39
- database: core_1.Args.string({ required: true }),
40
+ database: core_1.Args.string({ required: true, description: (0, nls_1.nls)('pg:database:arg:description') }),
40
41
  };
@@ -8,6 +8,7 @@ const fetcher_1 = require("../../lib/pg/fetcher");
8
8
  const host_1 = require("../../lib/pg/host");
9
9
  const util_1 = require("../../lib/pg/util");
10
10
  const confirmCommand_1 = require("../../lib/confirmCommand");
11
+ const nls_1 = require("../../nls");
11
12
  class Upgrade extends command_1.Command {
12
13
  async run() {
13
14
  const { flags, args } = await this.parse(Upgrade);
@@ -54,5 +55,5 @@ Upgrade.flags = {
54
55
  remote: command_1.flags.remote(),
55
56
  };
56
57
  Upgrade.args = {
57
- database: core_1.Args.string(),
58
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
58
59
  };
@@ -5,6 +5,7 @@ const core_1 = require("@oclif/core");
5
5
  const fetcher_1 = require("../../lib/pg/fetcher");
6
6
  const psql_1 = require("../../lib/pg/psql");
7
7
  const tsheredoc_1 = require("tsheredoc");
8
+ const nls_1 = require("../../nls");
8
9
  class VacuumStats extends command_1.Command {
9
10
  async run() {
10
11
  const { flags, args } = await this.parse(VacuumStats);
@@ -61,5 +62,5 @@ VacuumStats.flags = {
61
62
  remote: command_1.flags.remote(),
62
63
  };
63
64
  VacuumStats.args = {
64
- database: core_1.Args.string(),
65
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:default:suffix')}` }),
65
66
  };
@@ -7,6 +7,7 @@ const debug_1 = require("debug");
7
7
  const fetcher_1 = require("../../lib/pg/fetcher");
8
8
  const host_1 = require("../../lib/pg/host");
9
9
  const notify_1 = require("../../lib/notify");
10
+ const nls_1 = require("../../nls");
10
11
  const wait = (ms) => new Promise(resolve => {
11
12
  setTimeout(resolve, ms);
12
13
  });
@@ -75,5 +76,5 @@ Wait.flags = {
75
76
  remote: command_1.flags.remote(),
76
77
  };
77
78
  Wait.args = {
78
- database: core_1.Args.string(),
79
+ database: core_1.Args.string({ description: `${(0, nls_1.nls)('pg:database:arg:description')} ${(0, nls_1.nls)('pg:database:arg:description:all-dbs:suffix')}` }),
79
80
  };
@@ -13,7 +13,7 @@ export default class PipelinesDiff extends Command {
13
13
  remote: import("@oclif/core/lib/interfaces").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser").CustomOptions>;
14
14
  };
15
15
  kolkrabbi: KolkrabbiAPI;
16
- getAppInfo: (appName: string, appId: string) => Promise<AppInfo>;
16
+ getAppInfo: (appName: string, appId: string, generation: string) => Promise<AppInfo>;
17
17
  run(): Promise<undefined>;
18
18
  }
19
19
  export {};
@@ -60,7 +60,8 @@ class PipelinesDiff extends command_1.Command {
60
60
  constructor() {
61
61
  super(...arguments);
62
62
  this.kolkrabbi = new kolkrabbi_api_1.default(this.config.userAgent, () => this.heroku.auth);
63
- this.getAppInfo = async (appName, appId) => {
63
+ this.getAppInfo = async (appName, appId, generation) => {
64
+ var _a;
64
65
  // Find GitHub connection for the app
65
66
  const githubApp = await this.kolkrabbi.getAppLink(appId)
66
67
  .catch(() => {
@@ -68,21 +69,31 @@ class PipelinesDiff extends command_1.Command {
68
69
  });
69
70
  // Find the commit hash of the latest release for this app
70
71
  let slug;
72
+ let ociImages;
73
+ let commit;
71
74
  try {
72
75
  const { body: releases } = await (0, api_1.getReleases)(this.heroku, appId);
73
76
  const release = releases.find(r => r.status === 'succeeded');
74
- if (!release || !release.slug) {
77
+ if (!release || !(release.slug || release.oci_image)) {
75
78
  throw new Error(`no release found for ${appName}`);
76
79
  }
77
- slug = await this.heroku.get(`/apps/${appId}/slugs/${release.slug.id}`, {
78
- headers: { Accept: api_1.V3_HEADER },
79
- }).then(res => res.body);
80
- // tslint:disable-next-line: no-unused
80
+ if (generation === 'cedar' && release.slug) {
81
+ slug = await this.heroku.get(`/apps/${appId}/slugs/${release.slug.id}`, {
82
+ headers: { Accept: api_1.SDK_HEADER },
83
+ }).then(res => res.body);
84
+ commit = slug.commit;
85
+ }
86
+ else if (generation === 'fir' && release.oci_image) {
87
+ ociImages = await this.heroku.get(`/apps/${appId}/oci-images/${release.oci_image.id}`, {
88
+ headers: { Accept: api_1.SDK_HEADER },
89
+ }).then(res => res.body);
90
+ commit = (_a = ociImages[0]) === null || _a === void 0 ? void 0 : _a.commit;
91
+ }
81
92
  }
82
- catch (_a) {
93
+ catch (_b) {
83
94
  return { name: appName, repo: githubApp.repo, hash: undefined };
84
95
  }
85
- return { name: appName, repo: githubApp.repo, hash: slug.commit };
96
+ return { name: appName, repo: githubApp.repo, hash: commit };
86
97
  };
87
98
  }
88
99
  async run() {
@@ -96,6 +107,7 @@ class PipelinesDiff extends command_1.Command {
96
107
  return;
97
108
  }
98
109
  const targetAppId = coupling.app.id;
110
+ const generation = coupling.generation;
99
111
  core_1.ux.action.start('Fetching apps from pipeline');
100
112
  const allApps = await (0, api_1.listPipelineApps)(this.heroku, coupling.pipeline.id);
101
113
  core_1.ux.action.stop();
@@ -104,20 +116,18 @@ class PipelinesDiff extends command_1.Command {
104
116
  return core_1.ux.error(`Unable to diff ${targetAppName}`);
105
117
  }
106
118
  const downstreamStage = PROMOTION_ORDER[PROMOTION_ORDER.indexOf(sourceStage) + 1];
107
- if (!downstreamStage || PROMOTION_ORDER.indexOf(sourceStage) < 0) { // eslint-disable-line unicorn/prefer-includes
119
+ if (!downstreamStage || !PROMOTION_ORDER.includes(sourceStage)) {
108
120
  return core_1.ux.error(`Unable to diff ${targetAppName}`);
109
121
  }
110
- const downstreamApps = allApps.filter(function (app) {
111
- return app.coupling.stage === downstreamStage;
112
- });
122
+ const downstreamApps = allApps.filter(app => app.pipelineCoupling.stage === downstreamStage);
113
123
  if (downstreamApps.length === 0) {
114
124
  return core_1.ux.error(`Cannot diff ${targetAppName} as there are no downstream apps configured`);
115
125
  }
116
126
  // Fetch GitHub repo/latest release hash for [target, downstream[0], .., downstream[n]] apps
117
- const appInfoPromises = [this.getAppInfo(targetAppName, targetAppId)];
127
+ const appInfoPromises = [this.getAppInfo(targetAppName, targetAppId, generation)];
118
128
  downstreamApps.forEach(app => {
119
129
  if (app.name && app.id) {
120
- appInfoPromises.push(this.getAppInfo(app.name, app.id));
130
+ appInfoPromises.push(this.getAppInfo(app.name, app.id, generation));
121
131
  }
122
132
  });
123
133
  core_1.ux.action.start('Fetching release info for all apps');
@@ -166,7 +166,7 @@ class Promote extends command_1.Command {
166
166
  else {
167
167
  const targetStage = PROMOTION_ORDER[PROMOTION_ORDER.indexOf(sourceStage) + 1];
168
168
  assertValidPromotion(appNameOrId, sourceStage, targetStage);
169
- targetApps = allApps.filter(app => app.coupling.stage === targetStage);
169
+ targetApps = allApps.filter(app => app.pipelineCoupling.stage === targetStage);
170
170
  assertApps(appNameOrId, targetApps, targetStage);
171
171
  promotionActionName = `Starting promotion to ${targetStage}`;
172
172
  }
@@ -12,12 +12,23 @@ class Enable extends command_1.Command {
12
12
  const { flags } = await this.parse(Enable);
13
13
  core_1.ux.action.start('Enabling dyno autoscaling');
14
14
  const [appResponse, formationResponse] = await Promise.all([
15
- this.heroku.get(`/apps/${flags.app}`),
16
- this.heroku.get(`/apps/${flags.app}/formation`),
15
+ this.heroku.get(`/apps/${flags.app}`, {
16
+ headers: {
17
+ Accept: 'application/vnd.heroku+json; version=3.sdk',
18
+ },
19
+ }),
20
+ this.heroku.get(`/apps/${flags.app}/formation`, {
21
+ headers: {
22
+ Accept: 'application/vnd.heroku+json; version=3.sdk',
23
+ },
24
+ }),
17
25
  ]);
18
26
  const app = appResponse.body;
19
27
  const formations = formationResponse.body;
20
28
  const webFormation = formations.find((f) => f.type === 'web');
29
+ if (app.generation === 'fir') {
30
+ throw new Error('Autoscaling is unavailable for apps in this space. See https://devcenter.heroku.com/articles/generations.');
31
+ }
21
32
  if (!webFormation)
22
33
  throw new Error(`${flags.app} does not have any web dynos to scale`);
23
34
  const { size } = webFormation;
@@ -7,7 +7,10 @@ const core_1 = require("@oclif/core");
7
7
  const time_1 = require("../../lib/time");
8
8
  const tsheredoc_1 = require("tsheredoc");
9
9
  function getProcessNumber(s) {
10
- return Number.parseInt(s.split('.', 2)[1], 10);
10
+ const [processType, dynoNumber] = (s.match(/^([^.]+)\.(.*)$/) || []).slice(1, 3);
11
+ if (!processType || !(dynoNumber === null || dynoNumber === void 0 ? void 0 : dynoNumber.match(/^\d+$/)))
12
+ return 0;
13
+ return Number.parseInt(dynoNumber, 10);
11
14
  }
12
15
  function uniqueValues(value, index, self) {
13
16
  return self.indexOf(value) === index;
@@ -135,11 +138,17 @@ class Index extends command_1.Command {
135
138
  const _a = await this.parse(Index), { flags } = _a, restParse = tslib_1.__rest(_a, ["flags"]);
136
139
  const { app, json, extended } = flags;
137
140
  const types = restParse.argv;
138
- const suffix = extended ? '?extended=true' : ''; // read previous comment, including this on the request doesn't make any difference.
141
+ const suffix = extended ? '?extended=true' : '';
139
142
  const promises = {
140
- dynos: this.heroku.request(`/apps/${app}/dynos${suffix}`),
141
- appInfo: this.heroku.request(`/apps/${app}`, { headers: { Accept: 'application/vnd.heroku+json; version=3.process-tier' } }),
142
- accountInfo: this.heroku.request('/account'),
143
+ dynos: this.heroku.request(`/apps/${app}/dynos${suffix}`, {
144
+ headers: { Accept: 'application/vnd.heroku+json; version=3.sdk' },
145
+ }),
146
+ appInfo: this.heroku.request(`/apps/${app}`, {
147
+ headers: { Accept: 'application/vnd.heroku+json; version=3.sdk' },
148
+ }),
149
+ accountInfo: this.heroku.request('/account', {
150
+ headers: { Accept: 'application/vnd.heroku+json; version=3.sdk' },
151
+ }),
143
152
  };
144
153
  const [{ body: dynos }, { body: appInfo }, { body: accountInfo }] = await Promise.all([promises.dynos, promises.appInfo, promises.accountInfo]);
145
154
  const shielded = appInfo.space && appInfo.space.shield;
@@ -191,5 +200,5 @@ Index.flags = {
191
200
  app: command_1.flags.app({ required: true }),
192
201
  remote: command_1.flags.remote(),
193
202
  json: command_1.flags.boolean({ description: 'display as json' }),
194
- extended: command_1.flags.boolean({ char: 'x', hidden: true }), // should be removed? Platform API doesn't serialize extended attributes even if the query param `extended=true` is sent.
203
+ extended: command_1.flags.boolean({ char: 'x', hidden: true }), // only works with sudo privileges
195
204
  };
@@ -187,7 +187,7 @@ Cli.flags = {
187
187
  remote: command_1.flags.remote(),
188
188
  };
189
189
  Cli.args = {
190
- database: core_1.Args.string(),
190
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
191
191
  };
192
192
  Cli.examples = [
193
193
  '$ heroku redis:cli --app=my-app my-database',
@@ -28,5 +28,5 @@ Credentials.flags = {
28
28
  reset: command_1.flags.boolean({ description: 'reset credentials' }),
29
29
  };
30
30
  Credentials.args = {
31
- database: core_1.Args.string({ required: false }),
31
+ database: core_1.Args.string({ required: false, description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
32
32
  };
@@ -21,5 +21,5 @@ Info.flags = {
21
21
  json: command_1.flags.boolean({ char: 'j', description: 'output in json format' }),
22
22
  };
23
23
  Info.args = {
24
- database: core_1.Args.string(),
24
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
25
25
  };
@@ -43,5 +43,5 @@ KeyspaceNotifications.flags = {
43
43
  config: command_1.flags.string({ char: 'c', description: 'set keyspace notifications configuration', hasValue: true, required: true }),
44
44
  };
45
45
  KeyspaceNotifications.args = {
46
- database: core_1.Args.string(),
46
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
47
47
  };
@@ -59,5 +59,5 @@ Maintenance.flags = {
59
59
  }),
60
60
  };
61
61
  Maintenance.args = {
62
- database: core_1.Args.string({ required: false }),
62
+ database: core_1.Args.string({ required: false, description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
63
63
  };
@@ -36,5 +36,5 @@ MaxMemory.flags = {
36
36
  remote: command_1.flags.remote(),
37
37
  };
38
38
  MaxMemory.args = {
39
- database: core_1.Args.string(),
39
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
40
40
  };
@@ -35,5 +35,5 @@ Promote.flags = {
35
35
  remote: command_1.flags.remote(),
36
36
  };
37
37
  Promote.args = {
38
- database: core_1.Args.string({ required: false }),
38
+ database: core_1.Args.string({ required: false, description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
39
39
  };
@@ -32,5 +32,5 @@ StatsReset.flags = {
32
32
  confirm: command_1.flags.string({ char: 'c' }),
33
33
  };
34
34
  StatsReset.args = {
35
- database: core_1.Args.string(),
35
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
36
36
  };
@@ -31,5 +31,5 @@ Timeout.flags = {
31
31
  seconds: command_1.flags.integer({ char: 's', description: 'set timeout value', required: true }),
32
32
  };
33
33
  Timeout.args = {
34
- database: core_1.Args.string(),
34
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
35
35
  };
@@ -33,5 +33,5 @@ Upgrade.flags = {
33
33
  confirm: command_1.flags.string({ char: 'c' }),
34
34
  };
35
35
  Upgrade.args = {
36
- database: core_1.Args.string(),
36
+ database: core_1.Args.string({ description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
37
37
  };
@@ -56,5 +56,5 @@ Wait.flags = {
56
56
  remote: command_1.flags.remote(),
57
57
  };
58
58
  Wait.args = {
59
- database: core_1.Args.string({ required: false }),
59
+ database: core_1.Args.string({ required: false, description: 'name of the Key-Value Store database. If omitted, it defaults to the primary database associated with the app.' }),
60
60
  };
@@ -57,8 +57,10 @@ class Index extends command_1.Command {
57
57
  const { app, num, json, extended } = flags;
58
58
  const url = `/apps/${app}/releases${extended ? '?extended=true' : ''}`;
59
59
  const { body: releases } = await this.heroku.request(url, {
60
- partial: true, headers: {
60
+ partial: true,
61
+ headers: {
61
62
  Range: `version ..; max=${num || 15}, order=desc`,
63
+ Accept: 'application/vnd.heroku+json; version=3.sdk',
62
64
  },
63
65
  });
64
66
  let optimizationWidth = 0;
@@ -100,7 +102,7 @@ class Index extends command_1.Command {
100
102
  let header = `${app} Releases`;
101
103
  const currentRelease = releases.find(r => r.current === true);
102
104
  if (currentRelease) {
103
- header += ' - ' + color_1.default.blue(`Current: v${currentRelease.version}`);
105
+ header += ' - ' + color_1.default.cyan(`Current: v${currentRelease.version}`);
104
106
  }
105
107
  core_1.ux.styledHeader(header);
106
108
  core_1.ux.table(releases, columns, { 'no-header': true, 'no-truncate': true, extended });
@@ -27,7 +27,11 @@ class Info extends command_1.Command {
27
27
  }
28
28
  core_1.ux.styledHeader(`Release ${color_1.default.cyan('v' + release.version)}`);
29
29
  core_1.ux.styledObject({
30
- 'Add-ons': release.addon_plan_names, Change: releaseChange, By: userEmail, When: release.created_at,
30
+ 'Add-ons': release.addon_plan_names,
31
+ Change: releaseChange,
32
+ By: userEmail,
33
+ 'Eligible for Rollback?': release.eligible_for_rollback ? 'Yes' : 'No',
34
+ When: release.created_at,
31
35
  });
32
36
  core_1.ux.log();
33
37
  core_1.ux.styledHeader(`${color_1.default.cyan('v' + release.version)} Config vars`);
@@ -52,5 +56,5 @@ Info.flags = {
52
56
  app: command_1.flags.app({ required: true }),
53
57
  };
54
58
  Info.args = {
55
- release: core_1.Args.string(),
59
+ release: core_1.Args.string({ description: 'ID of the release. If omitted, we use the last release ID.' }),
56
60
  };
@@ -33,5 +33,5 @@ Output.flags = {
33
33
  app: command_1.flags.app({ required: true }),
34
34
  };
35
35
  Output.args = {
36
- release: core_1.Args.string(),
36
+ release: core_1.Args.string({ description: 'ID of the release. If omitted, we use the last release ID.' }),
37
37
  };
@@ -10,8 +10,18 @@ class Rollback extends command_1.Command {
10
10
  const { flags, args } = await this.parse(Rollback);
11
11
  const { app } = flags;
12
12
  const release = await (0, releases_1.findByPreviousOrId)(this.heroku, app, args.release);
13
- core_1.ux.action.start(`Rolling back ${color_1.default.magenta(app)} to ${color_1.default.green('v' + release.version)}`);
14
- const { body: latest } = await this.heroku.post(`/apps/${app}/releases`, { body: { release: release.id } });
13
+ if (!release) {
14
+ core_1.ux.error(`No eligible release found for ${color_1.default.app(app)} to roll back to.`);
15
+ }
16
+ core_1.ux.action.start(`Rolling back ${color_1.default.app(app)} to ${color_1.default.green('v' + release.version)}`);
17
+ const { body: latest } = await this.heroku.post(`/apps/${app}/releases`, {
18
+ body: {
19
+ release: release.id,
20
+ },
21
+ headers: {
22
+ Accept: 'application/vnd.heroku+json; version=3.sdk',
23
+ },
24
+ });
15
25
  const streamUrl = latest.output_stream_url;
16
26
  core_1.ux.action.stop(`done, ${color_1.default.green('v' + latest.version)}`);
17
27
  core_1.ux.warn("Rollback affects code and config vars; it doesn't add or remove addons.");
@@ -37,12 +47,12 @@ Rollback.topic = 'releases';
37
47
  Rollback.hiddenAliases = ['rollback'];
38
48
  Rollback.description = `Roll back to a previous release.
39
49
 
40
- If RELEASE is not specified, it will roll back one release.
50
+ If RELEASE is not specified, it will roll back to the last eligible release.
41
51
  `;
42
52
  Rollback.flags = {
43
53
  remote: command_1.flags.remote(),
44
54
  app: command_1.flags.app({ required: true }),
45
55
  };
46
56
  Rollback.args = {
47
- release: core_1.Args.string(),
57
+ release: core_1.Args.string({ description: 'ID of the release. If omitted, we use the last eligible release.' }),
48
58
  };
@@ -14,5 +14,5 @@ class SessionsDestroy extends command_1.Command {
14
14
  exports.default = SessionsDestroy;
15
15
  SessionsDestroy.description = 'delete (logout) OAuth session by ID';
16
16
  SessionsDestroy.args = {
17
- id: core_1.Args.string({ required: true }),
17
+ id: core_1.Args.string({ required: true, description: 'ID of the OAuth session' }),
18
18
  };
@@ -66,7 +66,7 @@ Create.examples = [(0, tsheredoc_1.default) `
66
66
  CIDR: 10.0.0.0/16
67
67
  Data CIDR: 172.23.0.0/20
68
68
  State: allocating
69
- Generation: fir
69
+ Generation: cedar
70
70
  Created at: 2016-01-06T03:23:13Z
71
71
  `];
72
72
  Create.flags = {
@@ -25,5 +25,5 @@ Set.flags = {
25
25
  space: command_1.flags.string({ char: 's', description: 'space for which to set log drain', required: true }),
26
26
  };
27
27
  Set.args = {
28
- url: core_1.Args.string({ required: true }),
28
+ url: core_1.Args.string({ required: true, description: 'URL to replace the log drain with' }),
29
29
  };
@@ -9,15 +9,12 @@ class Add extends command_1.Command {
9
9
  const { flags, args } = await this.parse(Add);
10
10
  const { space } = flags;
11
11
  const url = `/spaces/${space}/inbound-ruleset`;
12
- const options = {
13
- headers: { Accept: 'application/vnd.heroku+json; version=3.dogwood' },
14
- };
15
- const { body: ruleset } = await this.heroku.get(url, options);
12
+ const { body: ruleset } = await this.heroku.get(url);
16
13
  if (!this.isUniqueRule(ruleset, args.source)) {
17
14
  throw new Error(`A rule already exists for ${args.source}.`);
18
15
  }
19
16
  ruleset.rules.push({ action: 'allow', source: args.source });
20
- await this.heroku.put(url, Object.assign(Object.assign({}, options), { body: ruleset }));
17
+ await this.heroku.put(url, { body: ruleset });
21
18
  core_1.ux.log(`Added ${color_1.default.cyan.bold(args.source)} to trusted IP ranges on ${color_1.default.cyan.bold(space)}`);
22
19
  core_1.ux.warn('It may take a few moments for the changes to take effect.');
23
20
  }
@@ -39,5 +36,5 @@ Add.flags = {
39
36
  confirm: command_1.flags.string({ description: 'set to space name to bypass confirm prompt' }),
40
37
  };
41
38
  Add.args = {
42
- source: core_1.Args.string({ required: true }),
39
+ source: core_1.Args.string({ required: true, description: 'IP address in CIDR notation' }),
43
40
  };