bdy 1.25.3-dev → 1.25.4-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 (40) hide show
  1. package/distTs/package.json +1 -1
  2. package/distTs/src/agent/socket/tunnel.js +2 -0
  3. package/distTs/src/command/agent/proxy/status.js +9 -2
  4. package/distTs/src/command/agent/status.js +22 -6
  5. package/distTs/src/command/agent/tags/get.js +9 -2
  6. package/distTs/src/command/agent/target/status.js +9 -2
  7. package/distTs/src/command/agent/tunnel/list.js +6 -1
  8. package/distTs/src/command/agent/tunnel/status.js +13 -1
  9. package/distTs/src/command/agent/version.js +7 -2
  10. package/distTs/src/command/api/info.js +50 -2
  11. package/distTs/src/command/api/list.js +18 -2
  12. package/distTs/src/command/artifact/create.js +5 -0
  13. package/distTs/src/command/artifact/publish.js +20 -22
  14. package/distTs/src/command/artifact/version/create.js +5 -0
  15. package/distTs/src/command/config/get/tunnel.js +8 -3
  16. package/distTs/src/command/config/get/tunnels.js +8 -3
  17. package/distTs/src/command/distro/create.js +5 -0
  18. package/distTs/src/command/distro/route/create.js +5 -0
  19. package/distTs/src/command/distro/route/update.js +5 -0
  20. package/distTs/src/command/distro/update.js +5 -0
  21. package/distTs/src/command/domain/search.js +31 -10
  22. package/distTs/src/command/environment/create.js +5 -0
  23. package/distTs/src/command/environment/update.js +5 -0
  24. package/distTs/src/command/sandbox/app/add.js +7 -1
  25. package/distTs/src/command/sandbox/app/logs.js +9 -4
  26. package/distTs/src/command/sandbox/create.js +13 -5
  27. package/distTs/src/command/sandbox/endpoint/add.js +5 -0
  28. package/distTs/src/command/sandbox/exec/command.js +15 -30
  29. package/distTs/src/command/sandbox/exec/logs.js +4 -29
  30. package/distTs/src/command/sandbox/finishExec.js +33 -0
  31. package/distTs/src/command/sandbox/logs.js +14 -1
  32. package/distTs/src/command/sandbox/snapshot/create.js +9 -1
  33. package/distTs/src/command/target/create.js +5 -0
  34. package/distTs/src/command/target/exec/logs.js +15 -2
  35. package/distTs/src/command/target/update.js +5 -0
  36. package/distTs/src/command/yaml/validate.js +111 -52
  37. package/distTs/src/openapi.js +8 -1
  38. package/distTs/src/output.js +39 -0
  39. package/distTs/src/texts.js +206 -1
  40. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "bdy",
3
3
  "preferGlobal": false,
4
- "version": "1.25.3-dev",
4
+ "version": "1.25.4-dev",
5
5
  "type": "commonjs",
6
6
  "license": "MIT",
7
7
  "homepage": "https://buddy.works/docs/cli",
@@ -30,6 +30,7 @@ class AgentSocketTunnel extends events_1.default {
30
30
  totalConnections;
31
31
  connections;
32
32
  dns;
33
+ rawStatus;
33
34
  constructor(socket, id) {
34
35
  super();
35
36
  this.id = id;
@@ -65,6 +66,7 @@ class AgentSocketTunnel extends events_1.default {
65
66
  };
66
67
  }
67
68
  onTunnelData(data) {
69
+ this.rawStatus = data;
68
70
  if (data.regionLatency)
69
71
  this.regionLatency = data.regionLatency;
70
72
  if (data.targetLatency)
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const output_1 = __importDefault(require("../../../output"));
9
- const commandAgentProxyStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_PROXY_STATUS);
10
- commandAgentProxyStatus.action(async () => {
9
+ const commandAgentProxyStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_PROXY_STATUS, { examples: texts_1.EXAMPLE_AGENT_PROXY_STATUS });
10
+ commandAgentProxyStatus.option('--format <text|json>', texts_1.OPTION_FORMAT);
11
+ commandAgentProxyStatus.action(async (options) => {
11
12
  const ApiAgent = require('../../../tunnel/api/agent').default;
12
13
  if (!commandAgentProxyStatus.agentInstalled) {
13
14
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
@@ -18,6 +19,12 @@ commandAgentProxyStatus.action(async () => {
18
19
  try {
19
20
  const api = new ApiAgent(commandAgentProxyStatus.agentPort || 0);
20
21
  const data = await api.fetchAgentProxy();
22
+ if (options.format === 'json') {
23
+ output_1.default.json(data);
24
+ if (!data.proxy)
25
+ output_1.default.exitError(texts_1.TXT_AGENT_PROXY_DISABLED);
26
+ output_1.default.exitNormal();
27
+ }
21
28
  if (data.proxy) {
22
29
  output_1.default.exitSuccess(texts_1.TXT_AGENT_PROXY_ENABLED);
23
30
  }
@@ -8,8 +8,8 @@ const node_fs_1 = require("node:fs");
8
8
  const texts_1 = require("../../texts");
9
9
  const utils_1 = require("../../utils");
10
10
  const tunnel_1 = require("../../types/tunnel");
11
- const commandAgentStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_STATUS);
12
- const outputStatus = (installed, standalone, version, id, running, enabled, target, tunneling, proxy, status) => {
11
+ const commandAgentStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_STATUS, { examples: texts_1.EXAMPLE_AGENT_STATUS, helpText: texts_1.HELP_AGENT_STATUS_JSON });
12
+ const outputStatus = (installed, standalone, version, id, running, enabled, target, tunneling, proxy, status, json) => {
13
13
  const AgentManager = require('../../agent/manager').default;
14
14
  if (!installed) {
15
15
  // Nothing loaded, yet there is a file where the install would be - it is unreadable or not
@@ -22,6 +22,22 @@ const outputStatus = (installed, standalone, version, id, running, enabled, targ
22
22
  }
23
23
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
24
24
  }
25
+ const orphan = AgentManager.system.getStandaloneConfigPath();
26
+ const orphanedConfig = !AgentManager.system.isUserOwnedInstall() && (0, node_fs_1.existsSync)(orphan)
27
+ ? orphan
28
+ : null;
29
+ if (json) {
30
+ output_1.default.json({
31
+ ...commandAgentStatus.agentStatus,
32
+ installed,
33
+ standalone,
34
+ id: id ?? null,
35
+ version: version || null,
36
+ running,
37
+ orphaned_config: orphanedConfig,
38
+ });
39
+ output_1.default.exitNormal();
40
+ }
25
41
  let txt = 'Installation: ';
26
42
  if (standalone)
27
43
  txt += 'App @ ';
@@ -66,13 +82,13 @@ const outputStatus = (installed, standalone, version, id, running, enabled, targ
66
82
  // above: an install made before those files moved keeps its config in the system directory
67
83
  // and reports itself as an app, and a leftover in the home is just as inert next to it.
68
84
  // Inert, but only findable if it is said out loud.
69
- const orphan = AgentManager.system.getStandaloneConfigPath();
70
- if (!AgentManager.system.isUserOwnedInstall() && (0, node_fs_1.existsSync)(orphan)) {
85
+ if (orphanedConfig) {
71
86
  output_1.default.error((0, texts_1.TXT_AGENT_APP_INSTALL_ORPHANED)(orphan));
72
87
  }
73
88
  output_1.default.exitNormal();
74
89
  };
75
- commandAgentStatus.action(async () => {
90
+ commandAgentStatus.option('--format <text|json>', texts_1.OPTION_FORMAT);
91
+ commandAgentStatus.action((options) => {
76
92
  let version = '';
77
93
  const id = commandAgentStatus.agentId;
78
94
  const running = !!commandAgentStatus.agentStatus;
@@ -89,6 +105,6 @@ commandAgentStatus.action(async () => {
89
105
  tunneling = commandAgentStatus.agentStatus.tunneling;
90
106
  proxy = commandAgentStatus.agentStatus.proxy;
91
107
  }
92
- outputStatus(!!commandAgentStatus.agentInstalled, !!commandAgentStatus.agentStandalone, version, id, running, enabled, target, tunneling, proxy, status);
108
+ outputStatus(!!commandAgentStatus.agentInstalled, !!commandAgentStatus.agentStandalone, version, id, running, enabled, target, tunneling, proxy, status, options.format === 'json');
93
109
  });
94
110
  exports.default = commandAgentStatus;
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const output_1 = __importDefault(require("../../../output"));
9
- const commandAgentTagsGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_AGENT_TAGS_GET);
10
- commandAgentTagsGet.action(async () => {
9
+ const commandAgentTagsGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_AGENT_TAGS_GET, { examples: texts_1.EXAMPLE_AGENT_TAGS_GET });
10
+ commandAgentTagsGet.option('--format <text|json>', texts_1.OPTION_FORMAT);
11
+ commandAgentTagsGet.action(async (options) => {
11
12
  const ApiAgent = require('../../../tunnel/api/agent').default;
12
13
  if (!commandAgentTagsGet.agentInstalled) {
13
14
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
@@ -18,6 +19,12 @@ commandAgentTagsGet.action(async () => {
18
19
  try {
19
20
  const api = new ApiAgent(commandAgentTagsGet.agentPort || 0);
20
21
  const data = await api.fetchAgentTags();
22
+ if (options.format === 'json') {
23
+ output_1.default.json(data);
24
+ if (!data.tags?.length)
25
+ output_1.default.exitError(texts_1.TXT_AGENT_NO_TAGS);
26
+ output_1.default.exitNormal();
27
+ }
21
28
  if (data.tags && data.tags.length > 0) {
22
29
  output_1.default.exitNormal(data.tags.join(' '));
23
30
  }
@@ -6,8 +6,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const utils_1 = require("../../../utils");
7
7
  const texts_1 = require("../../../texts");
8
8
  const output_1 = __importDefault(require("../../../output"));
9
- const commandAgentTargetStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_TARGET_STATUS);
10
- commandAgentTargetStatus.action(async () => {
9
+ const commandAgentTargetStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_TARGET_STATUS, { examples: texts_1.EXAMPLE_AGENT_TARGET_STATUS });
10
+ commandAgentTargetStatus.option('--format <text|json>', texts_1.OPTION_FORMAT);
11
+ commandAgentTargetStatus.action(async (options) => {
11
12
  const ApiAgent = require('../../../tunnel/api/agent').default;
12
13
  if (!commandAgentTargetStatus.agentInstalled) {
13
14
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
@@ -18,6 +19,12 @@ commandAgentTargetStatus.action(async () => {
18
19
  try {
19
20
  const api = new ApiAgent(commandAgentTargetStatus.agentPort || 0);
20
21
  const data = await api.fetchAgentTarget();
22
+ if (options.format === 'json') {
23
+ output_1.default.json(data);
24
+ if (!data.target)
25
+ output_1.default.exitError(texts_1.TXT_AGENT_TARGET_DISABLED);
26
+ output_1.default.exitNormal();
27
+ }
21
28
  if (data.target) {
22
29
  output_1.default.exitSuccess(texts_1.TXT_AGENT_TARGET_ENABLED);
23
30
  }
@@ -8,7 +8,8 @@ const texts_1 = require("../../../texts");
8
8
  const utils_1 = require("../../../utils");
9
9
  const commandAgentTunnelList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_AGENT_TUNNEL_LIST, { examples: texts_1.EXAMPLE_AGENT_TUNNEL_LIST });
10
10
  commandAgentTunnelList.alias('ls');
11
- commandAgentTunnelList.action(async () => {
11
+ commandAgentTunnelList.option('--format <text|json>', texts_1.OPTION_FORMAT);
12
+ commandAgentTunnelList.action(async (options) => {
12
13
  const ApiAgent = require('../../../tunnel/api/agent').default;
13
14
  if (!commandAgentTunnelList.agentInstalled) {
14
15
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
@@ -19,6 +20,10 @@ commandAgentTunnelList.action(async () => {
19
20
  try {
20
21
  const api = new ApiAgent(commandAgentTunnelList.agentPort || 0);
21
22
  const data = await api.fetchTunnels();
23
+ if (options.format === 'json') {
24
+ output_1.default.json(data);
25
+ output_1.default.exitNormal();
26
+ }
22
27
  output_1.default.agentTunnels(data.tunnels);
23
28
  }
24
29
  catch (err) {
@@ -8,7 +8,8 @@ const output_1 = __importDefault(require("../../../output"));
8
8
  const utils_1 = require("../../../utils");
9
9
  const commandAgentTunnelStatus = (0, utils_1.newCommand)('status', texts_1.DESC_COMMAND_AGENT_TUNNEL_STATUS, { examples: texts_1.EXAMPLE_AGENT_TUNNEL_STATUS });
10
10
  commandAgentTunnelStatus.argument('[id]', texts_1.OPTION_ID);
11
- commandAgentTunnelStatus.action(async (id) => {
11
+ commandAgentTunnelStatus.option('--format <text|json>', texts_1.OPTION_FORMAT);
12
+ commandAgentTunnelStatus.action(async (id, options) => {
12
13
  const ApiAgent = require('../../../tunnel/api/agent').default;
13
14
  const AgentSocketTunnel = require('../../../agent/socket/tunnel').default;
14
15
  if (!commandAgentTunnelStatus.agentInstalled) {
@@ -21,6 +22,12 @@ commandAgentTunnelStatus.action(async (id) => {
21
22
  const api = new ApiAgent(commandAgentTunnelStatus.agentPort || 0);
22
23
  if (!id) {
23
24
  const data = await api.fetchAgentTunneling();
25
+ if (options.format === 'json') {
26
+ output_1.default.json(data);
27
+ if (!data.tunneling)
28
+ output_1.default.exitError(texts_1.TXT_AGENT_TUNNELING_DISABLED);
29
+ output_1.default.exitNormal();
30
+ }
24
31
  if (data.tunneling) {
25
32
  output_1.default.exitSuccess(texts_1.TXT_AGENT_TUNNELING_ENABLED);
26
33
  }
@@ -32,6 +39,11 @@ commandAgentTunnelStatus.action(async (id) => {
32
39
  const ws = await api.socketTunnel(id);
33
40
  const tunnel = new AgentSocketTunnel(ws, id);
34
41
  await tunnel.waitForReady();
42
+ if (options.format === 'json') {
43
+ output_1.default.json(tunnel.rawStatus);
44
+ tunnel.close();
45
+ output_1.default.exitNormal();
46
+ }
35
47
  output_1.default.tunnel(tunnel);
36
48
  }
37
49
  catch (err) {
@@ -6,14 +6,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const output_1 = __importDefault(require("../../output"));
7
7
  const texts_1 = require("../../texts");
8
8
  const utils_1 = require("../../utils");
9
- const commandAgentVersion = (0, utils_1.newCommand)('version', texts_1.DESC_COMMAND_AGENT_VERSION);
10
- commandAgentVersion.action(async () => {
9
+ const commandAgentVersion = (0, utils_1.newCommand)('version', texts_1.DESC_COMMAND_AGENT_VERSION, { examples: texts_1.EXAMPLE_AGENT_VERSION });
10
+ commandAgentVersion.option('--format <text|json>', texts_1.OPTION_FORMAT);
11
+ commandAgentVersion.action(async (options) => {
11
12
  if (!commandAgentVersion.agentInstalled) {
12
13
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_INSTALLED);
13
14
  }
14
15
  if (!commandAgentVersion.agentStatus) {
15
16
  output_1.default.exitError(texts_1.ERR_AGENT_NOT_RUNNING);
16
17
  }
18
+ if (options.format === 'json') {
19
+ output_1.default.json(commandAgentVersion.agentStatus);
20
+ output_1.default.exitNormal();
21
+ }
17
22
  output_1.default.exitNormal(commandAgentVersion.agentStatus.version);
18
23
  });
19
24
  exports.default = commandAgentVersion;
@@ -9,6 +9,8 @@ const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
10
  /** `members` keeps declaration order, which numbers the listing; `values` does not. */
11
11
  const orderedMembers = (body) => {
12
+ if (body.kind === 'array')
13
+ return orderedMembers(body.items);
12
14
  if (body.kind !== 'union')
13
15
  return [];
14
16
  const members = body.discriminator?.members;
@@ -217,15 +219,19 @@ const chosen = (asked, names) => {
217
219
  const position = Number(asked);
218
220
  return Number.isInteger(position) && position >= 1 ? names[position - 1] : undefined;
219
221
  };
220
- const commandApiInfo = (0, utils_1.newCommand)('info', texts_1.DESC_COMMAND_API_INFO);
222
+ const commandApiInfo = (0, utils_1.newCommand)('info', texts_1.DESC_COMMAND_API_INFO, {
223
+ helpText: texts_1.HELP_API_INFO_JSON,
224
+ examples: texts_1.EXAMPLE_API_INFO,
225
+ });
221
226
  commandApiInfo.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
222
227
  commandApiInfo.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
223
228
  commandApiInfo.option('--request-schema <schema>', texts_1.OPT_COMMAND_API_INFO_SCHEMA);
224
229
  commandApiInfo.option('--response-schema <schema>', texts_1.OPT_COMMAND_API_INFO_SCHEMA);
225
230
  commandApiInfo.argument('<method>', texts_1.OPT_COMMAND_API_INFO_METHOD);
226
231
  commandApiInfo.argument('<url>', texts_1.OPT_COMMAND_API_INFO_URL);
232
+ commandApiInfo.option('--format <text|json>', texts_1.OPTION_FORMAT);
227
233
  commandApiInfo.action(async (fm, filterUrl, options) => {
228
- const { apiEndpoints } = require('../../openapi');
234
+ const { apiEndpoints, apiSpecification } = require('../../openapi');
229
235
  const workspace = input_1.default.restApiWorkspace(options.workspace);
230
236
  const project = input_1.default.restApiProject(options.project, true);
231
237
  const method = (input_1.default.restApiMethod(fm, false) ?? '').toLowerCase();
@@ -246,6 +252,48 @@ commandApiInfo.action(async (fm, filterUrl, options) => {
246
252
  const namesOf = (bodies) => bodies.flatMap((body) => [...orderedMembers(body)]);
247
253
  const request = chosen(options.requestSchema, namesOf((listed.request?.contents ?? []).map((content) => content.body)));
248
254
  const response = chosen(options.responseSchema, namesOf(listed.responses.flatMap((one) => one.contents.map((content) => content.body))));
255
+ if (options.format === 'json') {
256
+ const raw = await apiSpecification(client.baseUrl);
257
+ const schema = (asked, selected, bodies) => {
258
+ const refs = [];
259
+ for (let body of bodies) {
260
+ while (body.kind === 'array')
261
+ body = body.items;
262
+ if (body.kind === 'union' && selected) {
263
+ const name = memberDef(body, selected);
264
+ if (name && raw.components?.schemas?.[name])
265
+ return raw.components.schemas[name];
266
+ }
267
+ if ('ref' in body && body.ref)
268
+ refs.push(body.ref.name);
269
+ }
270
+ // Union positions use the same member list as text output. Only bodies
271
+ // without unions use reference positions across response/content order.
272
+ const name = refs.includes(asked)
273
+ ? asked
274
+ : namesOf(bodies).length === 0
275
+ ? chosen(asked, refs)
276
+ : undefined;
277
+ if (name && raw.components?.schemas?.[name])
278
+ return raw.components.schemas[name];
279
+ output_1.default.exitError((0, texts_1.ERR_API_SCHEMA_NOT_FOUND)(asked));
280
+ };
281
+ const requestSchema = options.requestSchema
282
+ ? schema(options.requestSchema, request, (listed.request?.contents ?? []).map((content) => content.body))
283
+ : undefined;
284
+ const responseSchema = options.responseSchema
285
+ ? schema(options.responseSchema, response, listed.responses.flatMap((one) => one.contents.map((content) => content.body)))
286
+ : undefined;
287
+ output_1.default.json(requestSchema && responseSchema
288
+ ? { request: requestSchema, response: responseSchema }
289
+ : (requestSchema ??
290
+ responseSchema ?? {
291
+ method: wanted.method.toUpperCase(),
292
+ path: (0, utils_1.openApiPrepareUrl)(wanted.path, workspace, project),
293
+ operation: raw.paths[wanted.path][method],
294
+ }));
295
+ output_1.default.exitNormal();
296
+ }
249
297
  const member = request || response
250
298
  ? { ...(request ? { request } : {}), ...(response ? { response } : {}) }
251
299
  : undefined;
@@ -25,12 +25,15 @@ const outputUrl = (operation, workspace, project) => {
25
25
  if (operation.summary)
26
26
  output_1.default.gray(operation.summary);
27
27
  };
28
- const commandApiList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_API_LIST);
28
+ const commandApiList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_API_LIST, {
29
+ examples: texts_1.EXAMPLE_API_LIST,
30
+ });
29
31
  commandApiList.alias('ls');
30
32
  commandApiList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
31
33
  commandApiList.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
32
34
  commandApiList.option('-m, --method <method>', texts_1.OPT_COMMAND_API_LIST_METHOD);
33
35
  commandApiList.option('-s, --search <phrase>', texts_1.OPT_COMMAND_API_LIST_SEARCH);
36
+ commandApiList.option('--format <text|json>', texts_1.OPTION_FORMAT);
34
37
  commandApiList.action(async (options) => {
35
38
  const { apiEndpoints } = require('../../openapi');
36
39
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -39,12 +42,25 @@ commandApiList.action(async (options) => {
39
42
  const filter = options.search;
40
43
  const client = input_1.default.restApiTokenClient(true);
41
44
  const api = await apiEndpoints(client.baseUrl);
45
+ const operations = [];
42
46
  for (const operation of await api.operations()) {
43
47
  if (filter && !operation.path.includes(filter))
44
48
  continue;
45
49
  if (filterMethod && filterMethod !== operation.method.toLowerCase())
46
50
  continue;
47
- outputUrl(operation, workspace, project);
51
+ if (options.format === 'json') {
52
+ operations.push({
53
+ method: operation.method.toUpperCase(),
54
+ path: (0, utils_1.openApiPrepareUrl)(operation.path, workspace, project),
55
+ summary: operation.summary,
56
+ });
57
+ }
58
+ else {
59
+ outputUrl(operation, workspace, project);
60
+ }
61
+ }
62
+ if (options.format === 'json') {
63
+ output_1.default.json(operations);
48
64
  }
49
65
  output_1.default.exitNormal();
50
66
  });
@@ -23,6 +23,7 @@ commandArtifactCreate.option('-a, --auth <user:pass>', texts_1.OPTION_HTTP_AUTH)
23
23
  commandArtifactCreate.option('--note <note>', texts_1.OPT_COMMAND_NOTE);
24
24
  commandArtifactCreate.option('--agent-note <note>', texts_1.OPT_COMMAND_AGENT_NOTE);
25
25
  commandArtifactCreate.argument('[name]', texts_1.OPT_COMMAND_ARTIFACT_NAME);
26
+ commandArtifactCreate.option('--format <text|json>', texts_1.OPTION_FORMAT);
26
27
  commandArtifactCreate.action(async (name, options) => {
27
28
  const humanId = require('human-id').default;
28
29
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -71,6 +72,10 @@ commandArtifactCreate.action(async (name, options) => {
71
72
  };
72
73
  }
73
74
  const result = await client.createArtifact(workspace, data);
75
+ if (options.format === 'json') {
76
+ output_1.default.json(result);
77
+ output_1.default.exitNormal();
78
+ }
74
79
  output_1.default.exitSuccess((0, texts_1.TXT_ARTIFACT_CREATED)(client.baseUrl, workspace, result));
75
80
  });
76
81
  exports.default = commandArtifactCreate;
@@ -25,8 +25,10 @@ commandArtifactPublish.option('--agent-note <note>', texts_1.OPTION_ARTIFACT_VER
25
25
  commandArtifactPublish.option('-f, --force', texts_1.OPTION_ARTIFACT_PUBLISH_OVERWRITE_VERSION);
26
26
  commandArtifactPublish.argument('<identifier>', texts_1.OPTION_ARTIFACT_ID);
27
27
  commandArtifactPublish.argument('<directory>', texts_1.OPTION_ARTIFACT_PUBLISH_PATH);
28
+ commandArtifactPublish.option('--format <text|json>', texts_1.OPTION_FORMAT);
28
29
  commandArtifactPublish.action(async (id, path, options) => {
29
30
  const { v4 } = require('uuid');
31
+ const say = output_1.default.progress(options.format === 'json');
30
32
  let dirPath = input_1.default.resolvePath(path);
31
33
  const workspace = input_1.default.restApiWorkspace(options.workspace);
32
34
  const project = input_1.default.restApiProject(options.project, true);
@@ -66,20 +68,15 @@ commandArtifactPublish.action(async (id, path, options) => {
66
68
  }
67
69
  }
68
70
  let artifactVersionId = data.artifact_version_id;
69
- let url;
70
71
  if (artifactVersionId && !options.force) {
71
72
  output_1.default.exitError(texts_1.ERR_ARTIFACT_VERSION_EXISTS);
72
73
  }
73
- if (!artifactVersionId) {
74
- const d = await client.createArtifactVersion(workspace, artifactId, version, options.note, options.agentNote);
75
- url = d.version_url;
76
- artifactVersionId = d.id;
77
- }
78
- else {
79
- const d = await client.getArtifactVersion(workspace, artifactId, artifactVersionId);
80
- url = d.version_url;
81
- }
82
- output_1.default.normal(texts_1.TXT_ARTIFACT_SCANNING_DIR, false);
74
+ const artifactVersion = !artifactVersionId
75
+ ? await client.createArtifactVersion(workspace, artifactId, version, options.note, options.agentNote)
76
+ : await client.getArtifactVersion(workspace, artifactId, artifactVersionId);
77
+ const url = artifactVersion.version_url;
78
+ artifactVersionId = artifactVersion.id;
79
+ say(texts_1.TXT_ARTIFACT_SCANNING_DIR, false);
83
80
  const stat = fs_1.default.statSync(dirPath);
84
81
  let entries;
85
82
  if (stat.isDirectory()) {
@@ -106,6 +103,10 @@ commandArtifactPublish.action(async (id, path, options) => {
106
103
  dirPath = parentPath;
107
104
  }
108
105
  const outputSuccess = () => {
106
+ if (options.format === 'json') {
107
+ output_1.default.json(artifactVersion);
108
+ output_1.default.exitNormal();
109
+ }
109
110
  output_1.default.object({
110
111
  Version: `${identifier}:${version}`,
111
112
  URL: url || '-',
@@ -114,16 +115,16 @@ commandArtifactPublish.action(async (id, path, options) => {
114
115
  output_1.default.exitNormal();
115
116
  };
116
117
  if (!entries.length) {
117
- output_1.default.normal(texts_1.TXT_ARTIFACT_NO_ENTRIES_FOUND);
118
+ say(texts_1.TXT_ARTIFACT_NO_ENTRIES_FOUND);
118
119
  outputSuccess();
119
120
  }
120
121
  else if (entries.length === 1) {
121
- output_1.default.normal(texts_1.TXT_ARTIFACT_ONE_ENTRY_FOUND);
122
+ say(texts_1.TXT_ARTIFACT_ONE_ENTRY_FOUND);
122
123
  }
123
124
  else {
124
- output_1.default.normal((0, texts_1.TXT_ARTIFACT_ENTRIES_FOUND)(entries.length));
125
+ say((0, texts_1.TXT_ARTIFACT_ENTRIES_FOUND)(entries.length));
125
126
  }
126
- output_1.default.normal((0, texts_1.TXT_ARTIFACT_ZIP_ENTRIES)(0));
127
+ say((0, texts_1.TXT_ARTIFACT_ZIP_ENTRIES)(0));
127
128
  const zipPath = (0, path_1.join)((0, utils_1.getHomeDirectory)(), `${v4()}.zip`);
128
129
  const clearZip = () => {
129
130
  try {
@@ -138,11 +139,9 @@ commandArtifactPublish.action(async (id, path, options) => {
138
139
  let proc = 0;
139
140
  await (0, utils_1.createZip)(dirPath, zipPath, entries, () => {
140
141
  proc += 1;
141
- output_1.default.clearPreviousLine();
142
- output_1.default.normal((0, texts_1.TXT_ARTIFACT_ZIP_ENTRIES)(proc));
142
+ say((0, texts_1.TXT_ARTIFACT_ZIP_ENTRIES)(proc), true, true);
143
143
  });
144
- output_1.default.clearPreviousLine();
145
- output_1.default.normal(texts_1.TXT_ARTIFACT_ZIPPED);
144
+ say(texts_1.TXT_ARTIFACT_ZIPPED, true, true);
146
145
  blob = await fs_1.default.openAsBlob(zipPath);
147
146
  }
148
147
  catch (err) {
@@ -151,10 +150,9 @@ commandArtifactPublish.action(async (id, path, options) => {
151
150
  output_1.default.exitError(texts_1.ERR_SWW);
152
151
  }
153
152
  try {
154
- output_1.default.normal(texts_1.TXT_ARTIFACT_UPLOADING);
153
+ say(texts_1.TXT_ARTIFACT_UPLOADING);
155
154
  await client.createArtifactVersionZip(workspace, artifactId, artifactVersionId, blob);
156
- output_1.default.clearPreviousLine();
157
- output_1.default.normal(texts_1.TXT_ARTIFACT_UPLOADED);
155
+ say(texts_1.TXT_ARTIFACT_UPLOADED, true, true);
158
156
  clearZip();
159
157
  outputSuccess();
160
158
  }
@@ -21,6 +21,7 @@ commandArtifactVersionCreate.option('--note <note>', texts_1.OPTION_ARTIFACT_VER
21
21
  commandArtifactVersionCreate.option('--agent-note <note>', texts_1.OPTION_ARTIFACT_VERSION_AGENT_NOTE);
22
22
  commandArtifactVersionCreate.option('--from <version>', texts_1.OPTION_ARTIFACT_VERSION_FROM);
23
23
  commandArtifactVersionCreate.argument('<identifier>', texts_1.OPTION_ARTIFACT_ID);
24
+ commandArtifactVersionCreate.option('--format <text|json>', texts_1.OPTION_FORMAT);
24
25
  commandArtifactVersionCreate.action(async (id, options) => {
25
26
  const workspace = input_1.default.restApiWorkspace(options.workspace);
26
27
  const project = input_1.default.restApiProject(options.project, true);
@@ -64,6 +65,10 @@ commandArtifactVersionCreate.action(async (id, options) => {
64
65
  output_1.default.exitError(texts_1.ERR_ARTIFACT_VERSION_EXISTS_NO_FORCE);
65
66
  }
66
67
  const d = await client.createArtifactVersion(workspace, artifactId, version, options.note, options.agentNote, options.from);
68
+ if (options.format === 'json') {
69
+ output_1.default.json(d);
70
+ output_1.default.exitNormal();
71
+ }
67
72
  const url = d.version_url;
68
73
  output_1.default.object({
69
74
  Version: `${identifier}:${version}`,
@@ -7,13 +7,18 @@ const cfg_1 = __importDefault(require("../../../tunnel/cfg"));
7
7
  const output_1 = __importDefault(require("../../../output"));
8
8
  const texts_1 = require("../../../texts");
9
9
  const utils_1 = require("../../../utils");
10
- const commandConfigGetTunnel = (0, utils_1.newCommand)('tunnel', texts_1.DESC_COMMAND_CONFIG_GET_TUNNEL);
10
+ const commandConfigGetTunnel = (0, utils_1.newCommand)('tunnel', texts_1.DESC_COMMAND_CONFIG_GET_TUNNEL, { examples: texts_1.EXAMPLE_CONFIG_GET_TUNNEL });
11
11
  commandConfigGetTunnel.argument('<name>', texts_1.OPTION_NAME);
12
- commandConfigGetTunnel.action((name) => {
12
+ commandConfigGetTunnel.option('--format <text|json>', texts_1.OPTION_FORMAT);
13
+ commandConfigGetTunnel.action((name, options) => {
13
14
  if (!cfg_1.default.hasTunnel(name)) {
14
15
  output_1.default.exitError((0, texts_1.ERR_TUNNEL_NOT_FOUND)(name));
15
16
  }
16
- output_1.default.configTunnel(cfg_1.default.getTunnel(name));
17
+ if (options.format === 'json') {
18
+ output_1.default.json(cfg_1.default.getTunnel(name));
19
+ }
20
+ else
21
+ output_1.default.configTunnel(cfg_1.default.getTunnel(name));
17
22
  output_1.default.exitNormal();
18
23
  });
19
24
  exports.default = commandConfigGetTunnel;
@@ -7,9 +7,14 @@ const cfg_1 = __importDefault(require("../../../tunnel/cfg"));
7
7
  const output_1 = __importDefault(require("../../../output"));
8
8
  const texts_1 = require("../../../texts");
9
9
  const utils_1 = require("../../../utils");
10
- const commandConfigGetTunnels = (0, utils_1.newCommand)('tunnels', texts_1.DESC_COMMAND_CONFIG_GET_TUNNELS);
11
- commandConfigGetTunnels.action(() => {
12
- output_1.default.configTunnels(cfg_1.default.getTunnels());
10
+ const commandConfigGetTunnels = (0, utils_1.newCommand)('tunnels', texts_1.DESC_COMMAND_CONFIG_GET_TUNNELS, { examples: texts_1.EXAMPLE_CONFIG_GET_TUNNELS });
11
+ commandConfigGetTunnels.option('--format <text|json>', texts_1.OPTION_FORMAT);
12
+ commandConfigGetTunnels.action((options) => {
13
+ if (options.format === 'json') {
14
+ output_1.default.json(cfg_1.default.getTunnels());
15
+ }
16
+ else
17
+ output_1.default.configTunnels(cfg_1.default.getTunnels());
13
18
  output_1.default.exitNormal();
14
19
  });
15
20
  exports.default = commandConfigGetTunnels;
@@ -20,6 +20,7 @@ commandDistroCreate.option('-i, --identifier <identifier>', texts_1.OPT_COMMAND_
20
20
  commandDistroCreate.option('-n, --name <name>', texts_1.OPT_COMMAND_DISTRO_NAME);
21
21
  commandDistroCreate.option('--note <note>', texts_1.OPT_COMMAND_DISTRO_NOTE);
22
22
  commandDistroCreate.option('--agent-note <note>', texts_1.OPT_COMMAND_DISTRO_AGENT_NOTE);
23
+ commandDistroCreate.option('--format <text|json>', texts_1.OPTION_FORMAT);
23
24
  commandDistroCreate.action(async (options) => {
24
25
  const humanId = require('human-id').default;
25
26
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -43,6 +44,10 @@ commandDistroCreate.action(async (options) => {
43
44
  if (project && scope === distro_1.SCOPE.PROJECT)
44
45
  body.project_name = project;
45
46
  const result = await client.createDistro(workspace, body);
47
+ if (options.format === 'json') {
48
+ output_1.default.json(result);
49
+ output_1.default.exitNormal();
50
+ }
46
51
  output_1.default.identifier(result.identifier);
47
52
  output_1.default.cyan(result.html_url);
48
53
  output_1.default.green(texts_1.TXT_COMMAND_DISTRO_CREATED);
@@ -24,6 +24,7 @@ commandDistroRouteCreate.option('--note <note>', texts_1.OPT_COMMAND_ROUTE_NOTE)
24
24
  commandDistroRouteCreate.option('--agent-note <note>', texts_1.OPT_COMMAND_ROUTE_AGENT_NOTE);
25
25
  commandDistroRouteCreate.option('--target <targets...>', texts_1.OPT_COMMAND_ROUTE_TARGET);
26
26
  commandDistroRouteCreate.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
27
+ commandDistroRouteCreate.option('--format <text|json>', texts_1.OPTION_FORMAT);
27
28
  commandDistroRouteCreate.action(async (identifier, options) => {
28
29
  const workspace = input_1.default.restApiWorkspace(options.workspace);
29
30
  const project = input_1.default.restApiProject(options.project, true);
@@ -53,6 +54,10 @@ commandDistroRouteCreate.action(async (identifier, options) => {
53
54
  }
54
55
  body.targets = await input_1.default.routeTarget(client, workspace, scope === distro_1.SCOPE.PROJECT ? project : null, options.target);
55
56
  const result = await client.createRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
57
+ if (options.format === 'json') {
58
+ output_1.default.json(result);
59
+ output_1.default.exitNormal();
60
+ }
56
61
  output_1.default.id(result.id);
57
62
  output_1.default.cyan(result.html_url);
58
63
  output_1.default.green(texts_1.TXT_COMMAND_ROUTE_CREATED);
@@ -25,6 +25,7 @@ commandDistroRouteUpdate.option('--agent-note <note>', texts_1.OPT_COMMAND_ROUTE
25
25
  commandDistroRouteUpdate.option('--target <targets...>', texts_1.OPT_COMMAND_ROUTE_TARGET);
26
26
  commandDistroRouteUpdate.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
27
27
  commandDistroRouteUpdate.argument('<route-id>', texts_1.OPT_COMMAND_ROUTE_ID);
28
+ commandDistroRouteUpdate.option('--format <text|json>', texts_1.OPTION_FORMAT);
28
29
  commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
29
30
  const workspace = input_1.default.restApiWorkspace(options.workspace);
30
31
  const project = input_1.default.restApiProject(options.project, true);
@@ -82,6 +83,10 @@ commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
82
83
  output_1.default.exitError(texts_1.ERR_COMMAND_NO_UPDATE);
83
84
  }
84
85
  const result = await client.updateRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId, body);
86
+ if (options.format === 'json') {
87
+ output_1.default.json(result);
88
+ output_1.default.exitNormal();
89
+ }
85
90
  output_1.default.id(result.id);
86
91
  output_1.default.cyan(result.html_url);
87
92
  output_1.default.green(texts_1.TXT_COMMAND_ROUTE_UPDATED);
@@ -22,6 +22,7 @@ commandDistroUpdate.option('--agent-note <note>', texts_1.OPT_COMMAND_DISTRO_AGE
22
22
  commandDistroUpdate.option('--enable', texts_1.OPT_COMMAND_DISTRO_ENABLE);
23
23
  commandDistroUpdate.option('--disable', texts_1.OPT_COMMAND_DISTRO_DISABLE);
24
24
  commandDistroUpdate.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
25
+ commandDistroUpdate.option('--format <text|json>', texts_1.OPTION_FORMAT);
25
26
  commandDistroUpdate.action(async (identifier, options) => {
26
27
  if (options.enable && options.disable) {
27
28
  output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_ENABLE_DISABLE);
@@ -59,6 +60,10 @@ commandDistroUpdate.action(async (identifier, options) => {
59
60
  output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
60
61
  }
61
62
  const result = await client.updateDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
63
+ if (options.format === 'json') {
64
+ output_1.default.json(result);
65
+ output_1.default.exitNormal();
66
+ }
62
67
  output_1.default.identifier(result.identifier);
63
68
  output_1.default.cyan(result.html_url);
64
69
  output_1.default.green(texts_1.TXT_COMMAND_DISTRO_UPDATED);