bdy 1.25.13-dev → 1.25.14-dev

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 (177) hide show
  1. package/distTs/package.json +1 -1
  2. package/distTs/src/agent/manager.js +19 -6
  3. package/distTs/src/agent/system.js +9 -4
  4. package/distTs/src/api/client.js +20 -7
  5. package/distTs/src/cliCommand.js +17 -1
  6. package/distTs/src/cliIndex.js +12 -2
  7. package/distTs/src/command/agent/debug.js +4 -3
  8. package/distTs/src/command/agent/disable.js +4 -3
  9. package/distTs/src/command/agent/enable.js +4 -3
  10. package/distTs/src/command/agent/install.js +28 -12
  11. package/distTs/src/command/agent/proxy/disable.js +4 -3
  12. package/distTs/src/command/agent/proxy/enable.js +4 -3
  13. package/distTs/src/command/agent/proxy/status.js +1 -1
  14. package/distTs/src/command/agent/restart.js +13 -5
  15. package/distTs/src/command/agent/start.js +11 -4
  16. package/distTs/src/command/agent/status.js +1 -1
  17. package/distTs/src/command/agent/stop.js +5 -4
  18. package/distTs/src/command/agent/tags/get.js +1 -1
  19. package/distTs/src/command/agent/tags/set.js +4 -3
  20. package/distTs/src/command/agent/target/disable.js +4 -3
  21. package/distTs/src/command/agent/target/enable.js +4 -3
  22. package/distTs/src/command/agent/target/status.js +1 -1
  23. package/distTs/src/command/agent/tunnel/disable.js +4 -3
  24. package/distTs/src/command/agent/tunnel/enable.js +4 -3
  25. package/distTs/src/command/agent/tunnel/http.js +10 -2
  26. package/distTs/src/command/agent/tunnel/list.js +1 -1
  27. package/distTs/src/command/agent/tunnel/remove.js +4 -3
  28. package/distTs/src/command/agent/tunnel/start.js +9 -5
  29. package/distTs/src/command/agent/tunnel/status.js +1 -1
  30. package/distTs/src/command/agent/tunnel/tcp.js +10 -2
  31. package/distTs/src/command/agent/tunnel/tls.js +10 -2
  32. package/distTs/src/command/agent/uninstall.js +6 -4
  33. package/distTs/src/command/agent/update.js +13 -5
  34. package/distTs/src/command/agent/user.js +4 -3
  35. package/distTs/src/command/agent/version.js +1 -1
  36. package/distTs/src/command/api/info.js +5 -3
  37. package/distTs/src/command/api/list.js +1 -0
  38. package/distTs/src/command/artifact/composer/publish.js +21 -16
  39. package/distTs/src/command/artifact/delete.js +8 -5
  40. package/distTs/src/command/artifact/docker/login.js +22 -5
  41. package/distTs/src/command/artifact/download.js +16 -15
  42. package/distTs/src/command/artifact/get.js +3 -2
  43. package/distTs/src/command/artifact/open.js +3 -2
  44. package/distTs/src/command/artifact/publish.js +3 -2
  45. package/distTs/src/command/artifact/version/create.js +3 -2
  46. package/distTs/src/command/artifact/version/delete.js +9 -6
  47. package/distTs/src/command/artifact/version/get.js +4 -3
  48. package/distTs/src/command/artifact/version/list.js +3 -2
  49. package/distTs/src/command/artifact/version/open.js +7 -6
  50. package/distTs/src/command/config/add/http.js +3 -2
  51. package/distTs/src/command/config/add/tcp.js +3 -2
  52. package/distTs/src/command/config/add/tls.js +3 -2
  53. package/distTs/src/command/config/get/region.js +5 -2
  54. package/distTs/src/command/config/get/timeout.js +5 -2
  55. package/distTs/src/command/config/get/token.js +5 -2
  56. package/distTs/src/command/config/get/tunnel.js +3 -2
  57. package/distTs/src/command/config/get/tunnels.js +1 -1
  58. package/distTs/src/command/config/get/whitelist.js +5 -2
  59. package/distTs/src/command/config/remove/token.js +4 -3
  60. package/distTs/src/command/config/remove/tunnel.js +6 -4
  61. package/distTs/src/command/config/set/region.js +4 -3
  62. package/distTs/src/command/config/set/timeout.js +4 -3
  63. package/distTs/src/command/config/set/token.js +5 -3
  64. package/distTs/src/command/config/set/whitelist.js +4 -3
  65. package/distTs/src/command/crawl/link.js +10 -4
  66. package/distTs/src/command/crawl/run.js +30 -18
  67. package/distTs/src/command/distro/delete.js +8 -5
  68. package/distTs/src/command/distro/get.js +3 -2
  69. package/distTs/src/command/distro/open.js +3 -2
  70. package/distTs/src/command/distro/route/create.js +3 -2
  71. package/distTs/src/command/distro/route/delete.js +8 -5
  72. package/distTs/src/command/distro/route/get.js +3 -2
  73. package/distTs/src/command/distro/route/list.js +3 -2
  74. package/distTs/src/command/distro/route/open.js +3 -2
  75. package/distTs/src/command/distro/route/update.js +3 -2
  76. package/distTs/src/command/distro/update.js +3 -2
  77. package/distTs/src/command/domain/buy.js +36 -17
  78. package/distTs/src/command/domain/get.js +3 -2
  79. package/distTs/src/command/domain/list.js +1 -1
  80. package/distTs/src/command/domain/open.js +4 -2
  81. package/distTs/src/command/domain/search.js +1 -0
  82. package/distTs/src/command/environment/create.js +1 -1
  83. package/distTs/src/command/environment/delete.js +6 -4
  84. package/distTs/src/command/environment/get.js +1 -0
  85. package/distTs/src/command/environment/list.js +1 -1
  86. package/distTs/src/command/environment/open.js +3 -1
  87. package/distTs/src/command/environment/update.js +1 -1
  88. package/distTs/src/command/login.js +29 -17
  89. package/distTs/src/command/logout.js +4 -3
  90. package/distTs/src/command/pipeline/create.js +13 -3
  91. package/distTs/src/command/pipeline/delete.js +9 -6
  92. package/distTs/src/command/pipeline/get.js +4 -3
  93. package/distTs/src/command/pipeline/open.js +2 -1
  94. package/distTs/src/command/pipeline/run/execution.js +3 -3
  95. package/distTs/src/command/pipeline/run/list.js +4 -3
  96. package/distTs/src/command/pipeline/run/open.js +2 -1
  97. package/distTs/src/command/pipeline/update.js +4 -3
  98. package/distTs/src/command/pipeline/yaml.js +4 -3
  99. package/distTs/src/command/project/link.js +74 -36
  100. package/distTs/src/command/project/list.js +1 -0
  101. package/distTs/src/command/project/open.js +3 -1
  102. package/distTs/src/command/register.js +2 -1
  103. package/distTs/src/command/sandbox/app/add.js +1 -0
  104. package/distTs/src/command/sandbox/app/list.js +1 -1
  105. package/distTs/src/command/sandbox/app/logs.js +1 -1
  106. package/distTs/src/command/sandbox/app/remove.js +4 -3
  107. package/distTs/src/command/sandbox/app/start.js +4 -3
  108. package/distTs/src/command/sandbox/app/status.js +3 -2
  109. package/distTs/src/command/sandbox/app/stop.js +4 -3
  110. package/distTs/src/command/sandbox/cp.js +23 -23
  111. package/distTs/src/command/sandbox/create.js +3 -1
  112. package/distTs/src/command/sandbox/destroy.js +6 -4
  113. package/distTs/src/command/sandbox/endpoint/add.js +1 -1
  114. package/distTs/src/command/sandbox/endpoint/delete.js +9 -6
  115. package/distTs/src/command/sandbox/endpoint/get.js +3 -2
  116. package/distTs/src/command/sandbox/endpoint/list.js +1 -1
  117. package/distTs/src/command/sandbox/exec/command.js +1 -0
  118. package/distTs/src/command/sandbox/exec/kill.js +7 -5
  119. package/distTs/src/command/sandbox/exec/list.js +1 -1
  120. package/distTs/src/command/sandbox/exec/logs.js +1 -1
  121. package/distTs/src/command/sandbox/exec/status.js +1 -1
  122. package/distTs/src/command/sandbox/get.js +1 -1
  123. package/distTs/src/command/sandbox/list.js +1 -1
  124. package/distTs/src/command/sandbox/logs.js +1 -1
  125. package/distTs/src/command/sandbox/open.js +3 -1
  126. package/distTs/src/command/sandbox/restart.js +9 -4
  127. package/distTs/src/command/sandbox/snapshot/create.js +1 -1
  128. package/distTs/src/command/sandbox/snapshot/delete.js +8 -5
  129. package/distTs/src/command/sandbox/snapshot/get.js +3 -2
  130. package/distTs/src/command/sandbox/snapshot/list.js +1 -1
  131. package/distTs/src/command/sandbox/snapshot/open.js +4 -2
  132. package/distTs/src/command/sandbox/ssh.js +1 -0
  133. package/distTs/src/command/sandbox/start.js +9 -4
  134. package/distTs/src/command/sandbox/status.js +1 -1
  135. package/distTs/src/command/sandbox/stop.js +9 -4
  136. package/distTs/src/command/sandbox/update.js +12 -6
  137. package/distTs/src/command/sandbox/yaml.js +1 -1
  138. package/distTs/src/command/target/create.js +1 -0
  139. package/distTs/src/command/target/delete.js +6 -3
  140. package/distTs/src/command/target/exec/command.js +1 -1
  141. package/distTs/src/command/target/exec/kill.js +6 -4
  142. package/distTs/src/command/target/exec/list.js +1 -1
  143. package/distTs/src/command/target/exec/logs.js +1 -1
  144. package/distTs/src/command/target/exec/status.js +1 -1
  145. package/distTs/src/command/target/get.js +1 -0
  146. package/distTs/src/command/target/list.js +1 -0
  147. package/distTs/src/command/target/open.js +3 -1
  148. package/distTs/src/command/target/scope.js +4 -4
  149. package/distTs/src/command/target/update.js +1 -0
  150. package/distTs/src/command/tests/capture.js +10 -7
  151. package/distTs/src/command/tests/unit/link.js +10 -4
  152. package/distTs/src/command/tests/visual/link.js +10 -4
  153. package/distTs/src/command/tests/visual/session/close.js +8 -3
  154. package/distTs/src/command/tests/visual/setup.js +6 -3
  155. package/distTs/src/command/tests/visual/upload.js +11 -8
  156. package/distTs/src/command/tunnel/http.js +6 -2
  157. package/distTs/src/command/tunnel/start.js +8 -3
  158. package/distTs/src/command/tunnel/tcp.js +6 -3
  159. package/distTs/src/command/tunnel/tls.js +6 -3
  160. package/distTs/src/command/version.js +24 -2
  161. package/distTs/src/command/whoami.js +1 -1
  162. package/distTs/src/command/workspace/get.js +7 -2
  163. package/distTs/src/command/workspace/list.js +1 -1
  164. package/distTs/src/command/workspace/open.js +4 -2
  165. package/distTs/src/command/workspace/set.js +4 -3
  166. package/distTs/src/command/yaml/actions/info.js +1 -1
  167. package/distTs/src/command/yaml/actions/list.js +1 -1
  168. package/distTs/src/command/yaml/pipeline.js +1 -0
  169. package/distTs/src/command/yaml/validate.js +1 -0
  170. package/distTs/src/discovery.js +169 -50
  171. package/distTs/src/input.js +6 -6
  172. package/distTs/src/output.js +72 -33
  173. package/distTs/src/texts.js +103 -42
  174. package/distTs/src/tunnel/output/noninteractive/tunnelJsonl.js +62 -0
  175. package/distTs/src/utils.js +19 -0
  176. package/distTs/src/visualTest/browser.js +3 -2
  177. package/package.json +1 -1
@@ -8,7 +8,7 @@ const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
10
  const distro_1 = require("../../types/distro");
11
- const commandEnvironmentCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_ENVIRONMENT_CREATE, { examples: texts_1.EXAMPLE_ENVIRONMENT_CREATE });
11
+ const commandEnvironmentCreate = (0, utils_1.newCommand)('create', texts_1.DESC_COMMAND_ENVIRONMENT_CREATE, { requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_WRITE], examples: texts_1.EXAMPLE_ENVIRONMENT_CREATE });
12
12
  commandEnvironmentCreate.alias('add');
13
13
  commandEnvironmentCreate.option('-i, --identifier <identifier>', texts_1.OPTION_ENVIRONMENT_CREATE_IDENTIFIER);
14
14
  commandEnvironmentCreate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
@@ -7,21 +7,23 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const output_1 = __importDefault(require("../../output"));
9
9
  const input_1 = __importDefault(require("../../input"));
10
- const commandEnvironmentDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_ENVIRONMENT_DELETE, { examples: texts_1.EXAMPLE_ENVIRONMENT_DELETE });
10
+ const commandEnvironmentDelete = (0, utils_1.newCommand)('delete', texts_1.DESC_COMMAND_ENVIRONMENT_DELETE, { requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_MANAGE], examples: texts_1.EXAMPLE_ENVIRONMENT_DELETE });
11
11
  commandEnvironmentDelete.alias('rm');
12
12
  commandEnvironmentDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
13
  commandEnvironmentDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
14
14
  commandEnvironmentDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
15
+ commandEnvironmentDelete.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
16
  commandEnvironmentDelete.argument('<identifier>', texts_1.OPTION_ENVIRONMENT_IDENTIFIER);
16
17
  commandEnvironmentDelete.action(async (identifier, options) => {
17
18
  const workspace = input_1.default.restApiWorkspace(options.workspace);
18
19
  const client = input_1.default.restApiTokenClient();
19
20
  const environment_id = await input_1.default.environmentId(client, workspace, identifier, options,
20
21
  /* strictProject */ true);
21
- const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_ENVIRONMENT_DELETE_CONFIRM)(identifier));
22
+ const json = options.format === 'json';
23
+ const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_ENVIRONMENT_DELETE_CONFIRM)(identifier), json);
22
24
  if (!confirmed)
23
- output_1.default.exitNormal();
25
+ output_1.default.exitResult(json, { deleted: null });
24
26
  await client.deleteEnvironment(workspace, environment_id);
25
- output_1.default.exitSuccess((0, texts_1.TXT_ENVIRONMENT_DELETED)(identifier));
27
+ output_1.default.exitResult(json, { deleted: identifier }, (0, texts_1.TXT_ENVIRONMENT_DELETED)(identifier));
26
28
  });
27
29
  exports.default = commandEnvironmentDelete;
@@ -8,6 +8,7 @@ const texts_1 = require("../../texts");
8
8
  const output_1 = __importDefault(require("../../output"));
9
9
  const input_1 = __importDefault(require("../../input"));
10
10
  const commandEnvironmentGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_ENVIRONMENT_GET, {
11
+ requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_READ],
11
12
  examples: texts_1.EXAMPLE_ENVIRONMENT_GET,
12
13
  });
13
14
  commandEnvironmentGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
@@ -8,7 +8,7 @@ const texts_1 = require("../../texts");
8
8
  const output_1 = __importDefault(require("../../output"));
9
9
  const input_1 = __importDefault(require("../../input"));
10
10
  const distro_1 = require("../../types/distro");
11
- const commandEnvironmentList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_ENVIRONMENT_LIST, { examples: texts_1.EXAMPLE_ENVIRONMENT_LIST });
11
+ const commandEnvironmentList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_ENVIRONMENT_LIST, { requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_READ], examples: texts_1.EXAMPLE_ENVIRONMENT_LIST });
12
12
  commandEnvironmentList.alias('ls');
13
13
  commandEnvironmentList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
14
  commandEnvironmentList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
@@ -8,16 +8,18 @@ const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
10
  const commandEnvironmentOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMMAND_RESOURCE_OPEN, {
11
+ requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_READ],
11
12
  examples: [{ description: 'Open an environment in Buddy', command: 'bdy env open production' }],
12
13
  });
13
14
  commandEnvironmentOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
14
15
  commandEnvironmentOpen.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
16
+ commandEnvironmentOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
17
  commandEnvironmentOpen.argument('<identifier>', texts_1.OPTION_ENVIRONMENT_IDENTIFIER);
16
18
  commandEnvironmentOpen.action(async (identifier, options) => {
17
19
  const workspace = input_1.default.restApiWorkspace(options.workspace);
18
20
  const client = input_1.default.restApiTokenClient();
19
21
  const id = await input_1.default.environmentId(client, workspace, identifier, options);
20
22
  const environment = await client.getEnvironment(workspace, id);
21
- await output_1.default.openUrl(environment.html_url);
23
+ await output_1.default.openUrl(environment.html_url, options.format === 'json');
22
24
  });
23
25
  exports.default = commandEnvironmentOpen;
@@ -7,7 +7,7 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
- const commandEnvironmentUpdate = (0, utils_1.newCommand)('update', texts_1.DESC_COMMAND_ENVIRONMENT_UPDATE, { examples: texts_1.EXAMPLE_ENVIRONMENT_UPDATE });
10
+ const commandEnvironmentUpdate = (0, utils_1.newCommand)('update', texts_1.DESC_COMMAND_ENVIRONMENT_UPDATE, { requiredScopes: [utils_1.REST_API_SCOPE.ENVIRONMENT_WRITE], examples: texts_1.EXAMPLE_ENVIRONMENT_UPDATE });
11
11
  commandEnvironmentUpdate.alias('edit');
12
12
  commandEnvironmentUpdate.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
13
  commandEnvironmentUpdate.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
@@ -61,9 +61,13 @@ function generatePkcePair() {
61
61
  .digest('base64url');
62
62
  return { codeVerifier, codeChallenge };
63
63
  }
64
- async function waitForOpen(isRegister, abortCode, verbose = false, seconds = 3) {
65
- output_1.default.normal(isRegister ? texts_1.TXT_REGISTER_OPENING : texts_1.TXT_LOGIN_OPENING);
66
- if (verbose) {
64
+ async function waitForOpen(isRegister, abortCode, verbose = false, seconds = 3, json = false) {
65
+ // with --format json narration goes to stderr, keeping stdout for the result
66
+ if (json)
67
+ output_1.default.note(isRegister ? texts_1.TXT_REGISTER_OPENING : texts_1.TXT_LOGIN_OPENING);
68
+ else
69
+ output_1.default.normal(isRegister ? texts_1.TXT_REGISTER_OPENING : texts_1.TXT_LOGIN_OPENING);
70
+ if (verbose || json) {
67
71
  const end = Date.now() + seconds * 1000;
68
72
  while (Date.now() <= end && !abortCode.signal.aborted)
69
73
  await (0, utils_1.sleep)(500);
@@ -86,7 +90,7 @@ async function waitForOpen(isRegister, abortCode, verbose = false, seconds = 3)
86
90
  }
87
91
  output_1.default.clearPreviousLine();
88
92
  }
89
- async function oauthServer(api, clientId, clientSecret, forceRegisterEmail, forceRegisterName) {
93
+ async function oauthServer(api, clientId, clientSecret, forceRegisterEmail, forceRegisterName, json = false) {
90
94
  const isRegister = !!forceRegisterEmail && !!forceRegisterName;
91
95
  const ApiClient = require('../api/client').default;
92
96
  const open = require('open').default;
@@ -158,13 +162,19 @@ async function oauthServer(api, clientId, clientSecret, forceRegisterEmail, forc
158
162
  catch {
159
163
  // do nothing
160
164
  }
161
- await waitForOpen(isRegister, abortCode, !!ApiClient.onRequestTrace);
165
+ await waitForOpen(isRegister, abortCode, !!ApiClient.onRequestTrace, 3, json);
162
166
  if (abortCode.signal.aborted)
163
167
  return;
164
- output_1.default.dim(isRegister ? texts_1.TXT_REGISTER_OPEN_URL : texts_1.TXT_LOGIN_OPEN_URL);
165
- output_1.default.normal('');
166
- output_1.default.dim(url.replace(/%/g, '%%'));
167
- output_1.default.normal('');
168
+ if (json) {
169
+ output_1.default.note(isRegister ? texts_1.TXT_REGISTER_OPEN_URL : texts_1.TXT_LOGIN_OPEN_URL);
170
+ output_1.default.note(url);
171
+ }
172
+ else {
173
+ output_1.default.dim(isRegister ? texts_1.TXT_REGISTER_OPEN_URL : texts_1.TXT_LOGIN_OPEN_URL);
174
+ output_1.default.normal('');
175
+ output_1.default.dim(url.replace(/%/g, '%%'));
176
+ output_1.default.normal('');
177
+ }
168
178
  for (;;) {
169
179
  try {
170
180
  const code = await output_1.default.inputString(texts_1.TXT_LOGIN_PROVIDE_CODE, undefined, false, abortCode.signal);
@@ -230,12 +240,12 @@ async function getOrCreateApp(api) {
230
240
  clientToken,
231
241
  };
232
242
  }
233
- async function authorizeOAuth(api, forceRegisterEmail, forceRegisterName) {
243
+ async function authorizeOAuth(api, forceRegisterEmail, forceRegisterName, json = false) {
234
244
  const { clientId, clientSecret, clientToken } = await getOrCreateApp(api);
235
- const { token, refreshToken } = await oauthServer(api, clientId, clientSecret, forceRegisterEmail, forceRegisterName);
245
+ const { token, refreshToken } = await oauthServer(api, clientId, clientSecret, forceRegisterEmail, forceRegisterName, json);
236
246
  return { token, refreshToken, clientId, clientSecret, clientToken };
237
247
  }
238
- async function authorizeToken(isRegister, api, token, refreshToken, clientId, clientSecret, clientToken, workspace) {
248
+ async function authorizeToken(isRegister, api, token, refreshToken, clientId, clientSecret, clientToken, workspace, json = false) {
239
249
  const ApiClient = require('../api/client').default;
240
250
  cfg_1.default.setApiToken(token);
241
251
  cfg_1.default.setApiRefreshToken(refreshToken);
@@ -254,11 +264,12 @@ async function authorizeToken(isRegister, api, token, refreshToken, clientId, cl
254
264
  workspace = await output_1.default.selectWorkspace(w.workspaces);
255
265
  }
256
266
  cfg_1.default.setWorkspace(workspace);
257
- output_1.default.exitSuccess(isRegister ? texts_1.TXT_REGISTER_SUCCESS : texts_1.TXT_LOGIN_SUCCESS);
267
+ output_1.default.exitResult(json, { workspace, api }, isRegister ? texts_1.TXT_REGISTER_SUCCESS : texts_1.TXT_LOGIN_SUCCESS);
258
268
  }
259
269
  async function authorize(options, forceRegisterEmail, forceRegisterName) {
260
270
  cfg_1.default.clearLogin();
261
271
  const isRegister = !!forceRegisterEmail && !!forceRegisterName;
272
+ const json = options.format === 'json';
262
273
  let api = options.api || process.env.BUDDY_API_ENDPOINT;
263
274
  let region = options.region || process.env.BUDDY_REGION;
264
275
  let token = options.token;
@@ -299,20 +310,21 @@ async function authorize(options, forceRegisterEmail, forceRegisterName) {
299
310
  if (!output_1.default.isStdInTTY()) {
300
311
  output_1.default.exitError(texts_1.ERR_TOKEN_NOT_PROVIDED);
301
312
  }
302
- const { token, refreshToken, clientId, clientSecret, clientToken } = await authorizeOAuth(api, forceRegisterEmail, forceRegisterName);
303
- await authorizeToken(isRegister, api, token, refreshToken, clientId, clientSecret, clientToken, workspace);
313
+ const { token, refreshToken, clientId, clientSecret, clientToken } = await authorizeOAuth(api, forceRegisterEmail, forceRegisterName, json);
314
+ await authorizeToken(isRegister, api, token, refreshToken, clientId, clientSecret, clientToken, workspace, json);
304
315
  }
305
316
  else {
306
- await authorizeToken(false, api, token, '', '', '', '', workspace);
317
+ await authorizeToken(false, api, token, '', '', '', '', workspace, json);
307
318
  }
308
319
  }
309
- const commandLogin = (0, utils_1.newCommand)('login', texts_1.DESC_COMMAND_LOGIN);
320
+ const commandLogin = (0, utils_1.newCommand)('login', texts_1.DESC_COMMAND_LOGIN, { requiredScopes: [utils_1.REST_API_SCOPE.WORKSPACE_READ] });
310
321
  commandLogin.usesDefaultContext = true;
311
322
  commandLogin.alias('sign-in');
312
323
  commandLogin.option('--token <token>', texts_1.OPTION_REST_API_TOKEN);
313
324
  commandLogin.option('--api <url>', texts_1.OPTION_REST_API_ENDPOINT);
314
325
  commandLogin.option('--region <region>', texts_1.OPTION_REST_API_REGION);
315
326
  commandLogin.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
327
+ commandLogin.option('--format <text|json>', texts_1.OPTION_FORMAT);
316
328
  commandLogin.action(async (options) => {
317
329
  output_1.default.handleSignals();
318
330
  await authorize(options);
@@ -8,8 +8,9 @@ const output_1 = __importDefault(require("../output"));
8
8
  const texts_1 = require("../texts");
9
9
  const utils_1 = require("../utils");
10
10
  const input_1 = __importDefault(require("../input"));
11
- const commandLogout = (0, utils_1.newCommand)('logout', texts_1.DESC_COMMAND_LOGOUT);
11
+ const commandLogout = (0, utils_1.newCommand)('logout', texts_1.DESC_COMMAND_LOGOUT, { requiredScopes: [] });
12
12
  commandLogout.usesDefaultContext = true;
13
+ commandLogout.option('--format <text|json>', texts_1.OPTION_FORMAT);
13
14
  const tryRemovingApp = async () => {
14
15
  try {
15
16
  const clientId = cfg_1.default.getApiClientId();
@@ -20,9 +21,9 @@ const tryRemovingApp = async () => {
20
21
  // do nothing
21
22
  }
22
23
  };
23
- commandLogout.action(async () => {
24
+ commandLogout.action(async (options) => {
24
25
  await tryRemovingApp();
25
26
  cfg_1.default.clearLogin();
26
- output_1.default.exitSuccess(texts_1.TXT_LOGOUT_SUCCESS);
27
+ output_1.default.exitResult(options.format === 'json', { logged_out: true }, texts_1.TXT_LOGOUT_SUCCESS);
27
28
  });
28
29
  exports.default = commandLogout;
@@ -22,6 +22,8 @@ commandPipelineCreate.action(async (options) => {
22
22
  const workspace = input_1.default.restApiWorkspace(options.workspace);
23
23
  const project = input_1.default.restApiProject(options.project);
24
24
  const client = input_1.default.restApiTokenClient();
25
+ // read before creating, so a missing file leaves no empty pipeline behind
26
+ const yaml = options.yaml ? input_1.default.restApiYaml(options.yaml) : null;
25
27
  const humanId = require('human-id').default;
26
28
  const timestamp = Date.now().toString(36);
27
29
  const baseName = humanId({ separator: '-', capitalize: false });
@@ -31,12 +33,20 @@ commandPipelineCreate.action(async (options) => {
31
33
  identifier: options.identifier || defaultIdentifier,
32
34
  };
33
35
  let result = await client.createPipeline(workspace, project, body);
34
- if (options.yaml) {
35
- const yaml = input_1.default.restApiYaml(options.yaml);
36
+ if (yaml !== null) {
36
37
  body = {
37
38
  yaml: Buffer.from(yaml, 'utf8').toString('base64'),
38
39
  };
39
- await client.updatePipelineYml(workspace, project, result.id, body);
40
+ try {
41
+ await client.updatePipelineYml(workspace, project, result.id, body);
42
+ }
43
+ catch (err) {
44
+ // the command fails, so it must not leave the empty pipeline behind
45
+ await client
46
+ .deletePipeline(workspace, project, result.id)
47
+ .catch(() => output_1.default.noteWarning((0, texts_1.TXT_PIPELINE_CREATE_ROLLBACK_FAILED)(result.id)));
48
+ throw err;
49
+ }
40
50
  }
41
51
  result = await client.getPipeline(workspace, project, result.id);
42
52
  if (options.format === 'json') {
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cliError_1 = __importDefault(require("../../cliError"));
6
7
  const utils_1 = require("../../utils");
7
8
  const texts_1 = require("../../texts");
8
9
  const input_1 = __importDefault(require("../../input"));
@@ -15,6 +16,7 @@ commandPipelineDelete.alias('rm');
15
16
  commandPipelineDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
17
  commandPipelineDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
18
  commandPipelineDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
19
+ commandPipelineDelete.option('--format <text|json>', texts_1.OPTION_FORMAT);
18
20
  commandPipelineDelete.argument('<identifier>', texts_1.OPTION_PIPELINE_IDENTIFIER);
19
21
  commandPipelineDelete.action(async (identifier, options) => {
20
22
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -22,21 +24,22 @@ commandPipelineDelete.action(async (identifier, options) => {
22
24
  const client = input_1.default.restApiTokenClient();
23
25
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
24
26
  if (!data || !data.domain) {
25
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
27
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
26
28
  }
27
29
  if (!data.project_identifier) {
28
- output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
30
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST));
29
31
  }
30
32
  if (!data.pipeline_id) {
31
- output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
33
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST));
32
34
  }
33
- const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_PIPELINE_DELETE_CONFIRM)(identifier));
35
+ const json = options.format === 'json';
36
+ const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_PIPELINE_DELETE_CONFIRM)(identifier), json);
34
37
  if (confirmed) {
35
38
  await client.deletePipeline(workspace, project, data.pipeline_id);
36
- output_1.default.exitSuccess(texts_1.TXT_PIPELINE_DELETED);
39
+ output_1.default.exitResult(json, { deleted: identifier }, texts_1.TXT_PIPELINE_DELETED);
37
40
  }
38
41
  else {
39
- output_1.default.exitNormal();
42
+ output_1.default.exitResult(json, { deleted: null });
40
43
  }
41
44
  });
42
45
  exports.default = commandPipelineDelete;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cliError_1 = __importDefault(require("../../cliError"));
6
7
  const utils_1 = require("../../utils");
7
8
  const texts_1 = require("../../texts");
8
9
  const input_1 = __importDefault(require("../../input"));
@@ -21,13 +22,13 @@ commandPipelineGet.action(async (identifier, options) => {
21
22
  const client = input_1.default.restApiTokenClient();
22
23
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
23
24
  if (!data || !data.domain) {
24
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
25
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
25
26
  }
26
27
  if (!data.project_identifier) {
27
- output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
28
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST));
28
29
  }
29
30
  if (!data.pipeline_id) {
30
- output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
31
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST));
31
32
  }
32
33
  const pipeline = await client.getPipeline(workspace, project, data.pipeline_id);
33
34
  if (options.format === 'json') {
@@ -14,6 +14,7 @@ const commandPipelineOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMMAND
14
14
  });
15
15
  commandPipelineOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
16
  commandPipelineOpen.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandPipelineOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
17
18
  commandPipelineOpen.argument('<identifier>', texts_1.OPTION_PIPELINE_IDENTIFIER);
18
19
  commandPipelineOpen.action(async (identifier, options) => {
19
20
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -21,6 +22,6 @@ commandPipelineOpen.action(async (identifier, options) => {
21
22
  const client = input_1.default.restApiTokenClient();
22
23
  const pipelineId = await (0, execution_1.resolvePipelineId)(client, workspace, project, identifier);
23
24
  const pipeline = await client.getPipeline(workspace, project, pipelineId);
24
- await output_1.default.openUrl(pipeline.html_url);
25
+ await output_1.default.openUrl(pipeline.html_url, options.format === 'json');
25
26
  });
26
27
  exports.default = commandPipelineOpen;
@@ -10,11 +10,11 @@ const texts_1 = require("../../../texts");
10
10
  async function resolvePipelineId(client, workspace, project, identifier) {
11
11
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
12
12
  if (!data || !data.domain)
13
- throw new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND);
13
+ throw new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST);
14
14
  if (!data.project_identifier)
15
- throw new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND);
15
+ throw new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST);
16
16
  if (!data.pipeline_id) {
17
- throw new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND);
17
+ throw new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST);
18
18
  }
19
19
  return data.pipeline_id;
20
20
  }
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cliError_1 = __importDefault(require("../../../cliError"));
6
7
  const utils_1 = require("../../../utils");
7
8
  const texts_1 = require("../../../texts");
8
9
  const input_1 = __importDefault(require("../../../input"));
@@ -26,13 +27,13 @@ commandPipelineRunList.action(async (identifier, options) => {
26
27
  const client = input_1.default.restApiTokenClient();
27
28
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
28
29
  if (!data || !data.domain) {
29
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
30
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
30
31
  }
31
32
  if (!data.project_identifier) {
32
- output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
33
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST));
33
34
  }
34
35
  if (!data.pipeline_id) {
35
- output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
36
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST));
36
37
  }
37
38
  const result = await client.getPipelineRuns(workspace, project, data.pipeline_id, page, perPage);
38
39
  if (!result.executions.length) {
@@ -14,6 +14,7 @@ const commandPipelineRunOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMM
14
14
  });
15
15
  commandPipelineRunOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
16
  commandPipelineRunOpen.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
17
+ commandPipelineRunOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
17
18
  commandPipelineRunOpen.argument('<identifier>', texts_1.OPTION_PIPELINE_IDENTIFIER);
18
19
  commandPipelineRunOpen.argument('<run-id>', texts_1.OPTION_PIPELINE_RUN_ID);
19
20
  commandPipelineRunOpen.action(async (identifier, runId, options) => {
@@ -23,6 +24,6 @@ commandPipelineRunOpen.action(async (identifier, runId, options) => {
23
24
  const rid = input_1.default.pipelineRunId(runId);
24
25
  const pipelineId = await (0, execution_1.resolvePipelineId)(client, workspace, project, identifier);
25
26
  const run = await client.getPipelineRun(workspace, project, pipelineId, rid);
26
- await output_1.default.openUrl(run.html_url);
27
+ await output_1.default.openUrl(run.html_url, options.format === 'json');
27
28
  });
28
29
  exports.default = commandPipelineRunOpen;
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cliError_1 = __importDefault(require("../../cliError"));
6
7
  const utils_1 = require("../../utils");
7
8
  const texts_1 = require("../../texts");
8
9
  const input_1 = __importDefault(require("../../input"));
@@ -23,13 +24,13 @@ commandPipelineUpdate.action(async (identifier, y, options) => {
23
24
  const client = input_1.default.restApiTokenClient();
24
25
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
25
26
  if (!data || !data.domain) {
26
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
27
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
27
28
  }
28
29
  if (!data.project_identifier) {
29
- output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
30
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST));
30
31
  }
31
32
  if (!data.pipeline_id) {
32
- output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
33
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST));
33
34
  }
34
35
  await client.updatePipelineYml(workspace, project, data.pipeline_id, {
35
36
  yaml: Buffer.from(yaml, 'utf8').toString('base64'),
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const cliError_1 = __importDefault(require("../../cliError"));
6
7
  const utils_1 = require("../../utils");
7
8
  const texts_1 = require("../../texts");
8
9
  const input_1 = __importDefault(require("../../input"));
@@ -22,13 +23,13 @@ commandPipelineYaml.action(async (identifier, options) => {
22
23
  const client = input_1.default.restApiTokenClient();
23
24
  const data = await client.getPipelineByIdentifier(workspace, project, identifier);
24
25
  if (!data || !data.domain) {
25
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
26
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
26
27
  }
27
28
  if (!data.project_identifier) {
28
- output_1.default.exitError(texts_1.ERR_PROJECT_NOT_FOUND);
29
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PROJECT_NOT_FOUND, texts_1.HINT_PROJECT_LIST));
29
30
  }
30
31
  if (!data.pipeline_id) {
31
- output_1.default.exitError(texts_1.ERR_PIPELINE_NOT_FOUND);
32
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_PIPELINE_NOT_FOUND, texts_1.HINT_PIPELINE_LIST));
32
33
  }
33
34
  const result = await client.getPipelineYml(workspace, project, data.pipeline_id);
34
35
  let yml = '';