bdy 1.25.13-stage → 1.25.15-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 +61 -50
  176. package/distTs/src/visualTest/browser.js +3 -2
  177. package/package.json +1 -1
@@ -8,10 +8,11 @@ const output_1 = __importDefault(require("../../../output"));
8
8
  const input_1 = __importDefault(require("../../../input"));
9
9
  const texts_1 = require("../../../texts");
10
10
  const utils_1 = require("../../../utils");
11
- const commandConfigSetWhitelist = (0, utils_1.newCommand)('whitelist', texts_1.DESC_COMMAND_CONFIG_SET_WHITELIST);
11
+ const commandConfigSetWhitelist = (0, utils_1.newCommand)('whitelist', texts_1.DESC_COMMAND_CONFIG_SET_WHITELIST, { requiredScopes: [] });
12
12
  commandConfigSetWhitelist.argument('[cidrs...]', texts_1.OPTION_WHITELIST, []);
13
- commandConfigSetWhitelist.action((whitelist) => {
13
+ commandConfigSetWhitelist.option('--format <text|json>', texts_1.OPTION_FORMAT);
14
+ commandConfigSetWhitelist.action((whitelist, options) => {
14
15
  cfg_1.default.setWhitelist(input_1.default.whitelist(whitelist));
15
- output_1.default.exitSuccess(texts_1.TXT_WHITELIST_SAVED);
16
+ output_1.default.exitResult(options.format === 'json', { whitelist: cfg_1.default.getWhitelist().length ? cfg_1.default.getWhitelist() : null }, texts_1.TXT_WHITELIST_SAVED);
16
17
  });
17
18
  exports.default = commandConfigSetWhitelist;
@@ -7,15 +7,18 @@ const utils_1 = require("../../utils");
7
7
  const texts_1 = require("../../texts");
8
8
  const output_1 = __importDefault(require("../../output"));
9
9
  const commandCrawlLink = (0, utils_1.newCommand)('link', texts_1.DESC_COMMAND_CRAWL_LINK, {
10
+ requiredScopes: [utils_1.REST_API_SCOPE.CRAWL_WRITE],
10
11
  examples: texts_1.EXAMPLE_CRAWL_LINK,
11
12
  });
12
13
  commandCrawlLink.option('-w, --workspace <workspace>', texts_1.OPTION_REST_API_WORKSPACE);
13
14
  commandCrawlLink.option('-p, --project <project>', texts_1.OPTION_REST_API_PROJECT);
14
15
  commandCrawlLink.option('-s, --suite <suite>', texts_1.OPTION_SUITE_IDENTIFIER);
16
+ commandCrawlLink.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
17
  commandCrawlLink.action(async (options) => {
16
18
  const Input = require('../../input').default;
17
19
  const ProjectCfg = require('../../project/cfg').default;
18
20
  output_1.default.handleSignals();
21
+ const json = options.format === 'json';
19
22
  const workspace = Input.restApiWorkspace(options.workspace);
20
23
  const project = Input.restApiProject(options.project);
21
24
  const client = Input.restApiTokenClient(false, options.api, options.region);
@@ -36,8 +39,10 @@ commandCrawlLink.action(async (options) => {
36
39
  if (opt === 'new') {
37
40
  const name = await output_1.default.inputString(texts_1.TXT_COMMAND_SUITE_NAME);
38
41
  const response = await client.createCrawlSuite(workspace, project, { name, identifier: name });
39
- output_1.default.okSign();
40
- output_1.default.normal(texts_1.TXT_COMMAND_SUITE_CREATED);
42
+ if (!json) {
43
+ output_1.default.okSign();
44
+ output_1.default.normal(texts_1.TXT_COMMAND_SUITE_CREATED);
45
+ }
41
46
  suiteIdentifier = response.identifier;
42
47
  }
43
48
  else {
@@ -57,7 +62,8 @@ commandCrawlLink.action(async (options) => {
57
62
  }
58
63
  }
59
64
  ProjectCfg.setSuite((0, utils_1.getWorkingDir)(), 'crawl', suiteIdentifier);
60
- output_1.default.okSign();
61
- output_1.default.exitSuccess(texts_1.TXT_COMMAND_CRAWL_LINK_SUCCESS);
65
+ if (!json)
66
+ output_1.default.okSign();
67
+ output_1.default.exitResult(json, { suite: suiteIdentifier }, texts_1.TXT_COMMAND_CRAWL_LINK_SUCCESS);
62
68
  });
63
69
  exports.default = commandCrawlLink;
@@ -42,7 +42,10 @@ commandCrawlRun.option('--header <headers...>', texts_1.OPTION_COMPARE_HEADER);
42
42
  commandCrawlRun.option('--localStorage <items...>', texts_1.OPTION_CRAWL_LOCAL_STORAGE);
43
43
  commandCrawlRun.option('--delay <delays...>', texts_1.OPTION_CRAWL_DELAY);
44
44
  commandCrawlRun.option('--outputDir <dir>', texts_1.OPTION_CRAWL_OUTPUT_DIR, '.');
45
+ commandCrawlRun.option('--format <text|json>', texts_1.OPTION_FORMAT);
45
46
  commandCrawlRun.action(async (inputUrl, options) => {
47
+ const json = options.format === 'json';
48
+ const say = output_1.default.progress(json);
46
49
  const { downloadCrawlPackage, sendCrawl } = require('../../crawl/requests');
47
50
  const { createCrawlContext, applyToken, applyCiAndCommitInfo } = require('../../visualTest/context');
48
51
  const { validateInputAndOptions } = require('./validation');
@@ -60,25 +63,26 @@ commandCrawlRun.action(async (inputUrl, options) => {
60
63
  const ciAndGitInfo = await getCiAndGitInfo({});
61
64
  applyCiAndCommitInfo(ctx, ciAndGitInfo);
62
65
  const { buildId } = await sendCrawl(ctx, url, follow, respectRobots, outputTypes, colorScheme, browsers, devices, cookies, requestHeaders, delays, waitForSelectors, localStorage);
63
- const status = await watchSessionStatus(ctx, buildId);
66
+ const status = await watchSessionStatus(ctx, buildId, json);
64
67
  if (!status.ok) {
65
68
  output_1.default.exitError(`Crawl session failed: ${status.error}`);
66
69
  }
67
- output_1.default.normal('Downloading crawl package');
70
+ say('Downloading crawl package');
68
71
  const crawlPackageStream = await downloadCrawlPackage(ctx, buildId);
69
72
  const brotliDecompressor = (0, node_zlib_1.createBrotliDecompress)();
70
73
  const unpack = tar.extract();
74
+ const preparedOutputDir = outputDir.startsWith('.')
75
+ ? node_path_1.default.join(process.cwd(), outputDir)
76
+ : outputDir;
77
+ let files = 0;
71
78
  unpack.on('entry', async (header, stream, next) => {
72
- const currentDir = process.cwd();
73
- const preparedOutputDir = outputDir.startsWith('.')
74
- ? node_path_1.default.join(currentDir, outputDir)
75
- : outputDir;
76
79
  const newFilePath = node_path_1.default.join(preparedOutputDir, header.name);
77
80
  try {
78
81
  if (header.type === 'file') {
79
82
  await (0, promises_2.mkdir)(node_path_1.default.dirname(newFilePath), { recursive: true });
80
83
  const fileWriteStream = (0, node_fs_1.createWriteStream)(newFilePath);
81
84
  await (0, promises_1.pipeline)(stream, fileWriteStream);
85
+ files += 1;
82
86
  next();
83
87
  }
84
88
  else {
@@ -87,43 +91,51 @@ commandCrawlRun.action(async (inputUrl, options) => {
87
91
  }
88
92
  }
89
93
  catch (entryError) {
90
- output_1.default.error(`Error processing entry ${header.name}: ${entryError}`);
94
+ sayError(json, `Error processing entry ${header.name}: ${entryError}`);
91
95
  next(entryError);
92
96
  }
93
97
  });
94
98
  await (0, promises_1.pipeline)(crawlPackageStream, brotliDecompressor, unpack);
95
- output_1.default.exitSuccess('Downloading crawl package finished');
99
+ output_1.default.exitResult(json, { build_id: buildId, output_dir: preparedOutputDir, files }, 'Downloading crawl package finished');
96
100
  }
97
101
  catch (error) {
98
102
  output_1.default.exitError(`${error}`);
99
103
  }
100
104
  });
101
- async function watchSessionStatus(ctx, buildId) {
105
+ // with --format json session failures go to stderr, keeping stdout for the result
106
+ const sayError = (json, txt) => {
107
+ if (json)
108
+ output_1.default.noteWarning(txt);
109
+ else
110
+ output_1.default.error(txt);
111
+ };
112
+ async function watchSessionStatus(ctx, buildId, json) {
102
113
  const { connectToCrawlSession } = require('../../crawl/requests');
114
+ const say = output_1.default.progress(json);
103
115
  return new Promise((resolve) => {
104
116
  const eventSource = connectToCrawlSession(ctx, buildId);
105
117
  eventSource.addEventListener('SESSION_STATUS', (event) => {
106
118
  const data = JSON.parse(event.data);
107
119
  if (data.status === 'STARTED') {
108
- output_1.default.normal('Crawl session started');
120
+ say('Crawl session started');
109
121
  }
110
122
  else if (data.status === 'GATHER_URLS_COMPLETED') {
111
- output_1.default.normal(`Gathering URLs completed, found ${data.text} URLs`);
123
+ say(`Gathering URLs completed, found ${data.text} URLs`);
112
124
  }
113
125
  else if (data.status === 'GATHER_URLS_FAILED') {
114
- output_1.default.error('Gathering URLs failed');
126
+ sayError(json, 'Gathering URLs failed');
115
127
  }
116
128
  else if (data.status === 'CRAWL_URL_COMPLETED') {
117
- output_1.default.normal(`Crawling ${data.text} completed`);
129
+ say(`Crawling ${data.text} completed`);
118
130
  }
119
131
  else if (data.status === 'CRAWL_URL_FAILED') {
120
- output_1.default.error(`Crawling ${data.text} failed`);
132
+ sayError(json, `Crawling ${data.text} failed`);
121
133
  }
122
134
  else if (data.status === 'CREATE_PACKAGE_COMPLETED') {
123
- output_1.default.normal('Package created');
135
+ say('Package created');
124
136
  }
125
137
  else if (data.status === 'CREATE_PACKAGE_FAILED') {
126
- output_1.default.error('Package creation failed');
138
+ sayError(json, 'Package creation failed');
127
139
  }
128
140
  else if (data.status === 'ERROR') {
129
141
  eventSource.close();
@@ -131,7 +143,7 @@ async function watchSessionStatus(ctx, buildId) {
131
143
  }
132
144
  else if (data.status === 'FINISHED') {
133
145
  eventSource.close();
134
- output_1.default.normal('Crawl session finished');
146
+ say('Crawl session finished');
135
147
  resolve({ ok: true });
136
148
  }
137
149
  });
@@ -139,7 +151,7 @@ async function watchSessionStatus(ctx, buildId) {
139
151
  if (event.code) {
140
152
  eventSource.close();
141
153
  if (event.code === 410) {
142
- output_1.default.normal('Crawl session finished');
154
+ say('Crawl session finished');
143
155
  }
144
156
  resolve({ ok: event.code === 410, error: event.code });
145
157
  }
@@ -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"));
@@ -17,6 +18,7 @@ commandDistroDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_W
17
18
  commandDistroDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
18
19
  commandDistroDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
19
20
  commandDistroDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
21
+ commandDistroDelete.option('--format <text|json>', texts_1.OPTION_FORMAT);
20
22
  commandDistroDelete.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
21
23
  commandDistroDelete.action(async (identifier, options) => {
22
24
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -25,18 +27,19 @@ commandDistroDelete.action(async (identifier, options) => {
25
27
  const client = input_1.default.restApiTokenClient();
26
28
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
27
29
  if (!data || !data.domain) {
28
- 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));
29
31
  }
30
32
  if (!data || !data.distribution_id) {
31
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
33
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
32
34
  }
33
- const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_COMMAND_DISTRO_DELETE_CONFIRM)(identifier));
35
+ const json = options.format === 'json';
36
+ const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_COMMAND_DISTRO_DELETE_CONFIRM)(identifier), json);
34
37
  if (confirmed) {
35
38
  await client.deleteDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id);
36
- output_1.default.exitSuccess(texts_1.TXT_COMMAND_DISTRO_DELETED);
39
+ output_1.default.exitResult(json, { deleted: identifier }, texts_1.TXT_COMMAND_DISTRO_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 = commandDistroDelete;
@@ -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"));
@@ -24,10 +25,10 @@ commandDistroGet.action(async (identifier, options) => {
24
25
  const client = input_1.default.restApiTokenClient();
25
26
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
26
27
  if (!data || !data.domain) {
27
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
28
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
28
29
  }
29
30
  if (!data || !data.distribution_id) {
30
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
31
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
31
32
  }
32
33
  const distro = await client.getDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id);
33
34
  if (options.format === 'json') {
@@ -16,6 +16,7 @@ const commandDistroOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMMAND_R
16
16
  commandDistroOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
17
  commandDistroOpen.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
18
  commandDistroOpen.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
19
+ commandDistroOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
19
20
  commandDistroOpen.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
20
21
  commandDistroOpen.action(async (identifier, options) => {
21
22
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -25,8 +26,8 @@ commandDistroOpen.action(async (identifier, options) => {
25
26
  const client = input_1.default.restApiTokenClient();
26
27
  const data = await client.getDistributionByIdentifier(workspace, scopedProject, identifier);
27
28
  if (!data?.distribution_id)
28
- throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
29
+ throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST);
29
30
  const distro = await client.getDistribution(workspace, scopedProject, data.distribution_id);
30
- await output_1.default.openUrl(distro.html_url);
31
+ await output_1.default.openUrl(distro.html_url, options.format === 'json');
31
32
  });
32
33
  exports.default = commandDistroOpen;
@@ -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"));
@@ -47,10 +48,10 @@ commandDistroRouteCreate.action(async (identifier, options) => {
47
48
  body.agent_note = options.agentNote;
48
49
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
49
50
  if (!data?.domain) {
50
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
51
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
51
52
  }
52
53
  if (!data?.distribution_id) {
53
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
54
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
54
55
  }
55
56
  body.targets = await input_1.default.routeTarget(client, workspace, scope === distro_1.SCOPE.PROJECT ? project : null, options.target);
56
57
  const result = await client.createRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
@@ -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"));
@@ -17,6 +18,7 @@ commandDistroRouteDelete.option('-w, --workspace <domain>', texts_1.OPTION_REST_
17
18
  commandDistroRouteDelete.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
19
  commandDistroRouteDelete.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
19
20
  commandDistroRouteDelete.option('-f, --force', texts_1.OPTION_CONFIRM_FORCE);
21
+ commandDistroRouteDelete.option('--format <text|json>', texts_1.OPTION_FORMAT);
20
22
  commandDistroRouteDelete.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
21
23
  commandDistroRouteDelete.argument('<route-id>', texts_1.OPT_COMMAND_ROUTE_ID);
22
24
  commandDistroRouteDelete.action(async (identifier, routeId, options) => {
@@ -26,18 +28,19 @@ commandDistroRouteDelete.action(async (identifier, routeId, options) => {
26
28
  const client = input_1.default.restApiTokenClient();
27
29
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
28
30
  if (!data?.domain) {
29
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
31
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
30
32
  }
31
33
  if (!data?.distribution_id) {
32
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
34
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
33
35
  }
34
- const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_COMMAND_ROUTE_DELETE_CONFIRM)(identifier, routeId));
36
+ const json = options.format === 'json';
37
+ const confirmed = await output_1.default.confirmDestructive(options.force, (0, texts_1.TXT_COMMAND_ROUTE_DELETE_CONFIRM)(identifier, routeId), json);
35
38
  if (confirmed) {
36
39
  await client.deleteRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId);
37
- output_1.default.exitSuccess(texts_1.TXT_COMMAND_ROUTE_DELETED);
40
+ output_1.default.exitResult(json, { deleted: routeId }, texts_1.TXT_COMMAND_ROUTE_DELETED);
38
41
  }
39
42
  else {
40
- output_1.default.exitNormal();
43
+ output_1.default.exitResult(json, { deleted: null });
41
44
  }
42
45
  });
43
46
  exports.default = commandDistroRouteDelete;
@@ -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"));
@@ -34,10 +35,10 @@ commandDistroRouteGet.action(async (identifier, routeId, options) => {
34
35
  const client = input_1.default.restApiTokenClient();
35
36
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
36
37
  if (!data?.domain) {
37
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
38
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
38
39
  }
39
40
  if (!data?.distribution_id) {
40
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
41
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
41
42
  }
42
43
  const route = await client.getRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId);
43
44
  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"));
@@ -25,10 +26,10 @@ commandDistroRouteList.action(async (identifier, options) => {
25
26
  const client = input_1.default.restApiTokenClient();
26
27
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
27
28
  if (!data?.domain) {
28
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
29
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
29
30
  }
30
31
  if (!data?.distribution_id) {
31
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
32
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
32
33
  }
33
34
  const r = await client.listRoutes(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id);
34
35
  const routes = r.routes || [];
@@ -16,6 +16,7 @@ const commandDistroRouteOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMM
16
16
  commandDistroRouteOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
17
17
  commandDistroRouteOpen.option('-p, --project <name>', texts_1.OPTION_REST_API_PROJECT);
18
18
  commandDistroRouteOpen.option('--scope <scope>', texts_1.OPT_COMMAND_SCOPE);
19
+ commandDistroRouteOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
19
20
  commandDistroRouteOpen.argument('<identifier>', texts_1.OPT_COMMAND_DISTRO_IDENTIFIER);
20
21
  commandDistroRouteOpen.argument('<route-id>', texts_1.OPT_COMMAND_ROUTE_ID);
21
22
  commandDistroRouteOpen.action(async (identifier, routeId, options) => {
@@ -26,8 +27,8 @@ commandDistroRouteOpen.action(async (identifier, routeId, options) => {
26
27
  const client = input_1.default.restApiTokenClient();
27
28
  const data = await client.getDistributionByIdentifier(workspace, scopedProject, identifier);
28
29
  if (!data?.distribution_id)
29
- throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
30
+ throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST);
30
31
  const route = await client.getRoute(workspace, scopedProject, data.distribution_id, routeId);
31
- await output_1.default.openUrl(route.html_url);
32
+ await output_1.default.openUrl(route.html_url, options.format === 'json');
32
33
  });
33
34
  exports.default = commandDistroRouteOpen;
@@ -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"));
@@ -33,10 +34,10 @@ commandDistroRouteUpdate.action(async (identifier, routeId, options) => {
33
34
  const client = input_1.default.restApiTokenClient();
34
35
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
35
36
  if (!data?.domain) {
36
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
37
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
37
38
  }
38
39
  if (!data?.distribution_id) {
39
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
40
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
40
41
  }
41
42
  const route = await client.getRoute(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, routeId);
42
43
  let changed = false;
@@ -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"));
@@ -54,10 +55,10 @@ commandDistroUpdate.action(async (identifier, options) => {
54
55
  const client = input_1.default.restApiTokenClient();
55
56
  const data = await client.getDistributionByIdentifier(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, identifier);
56
57
  if (!data || !data.domain) {
57
- output_1.default.exitError(texts_1.ERR_WORKSPACE_NOT_FOUND);
58
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_WORKSPACE_NOT_FOUND, texts_1.HINT_WORKSPACE_LIST));
58
59
  }
59
60
  if (!data || !data.distribution_id) {
60
- output_1.default.exitError(texts_1.ERR_COMMAND_DISTRO_NOT_FOUND);
61
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DISTRO_NOT_FOUND, texts_1.HINT_DISTRO_LIST));
61
62
  }
62
63
  const result = await client.updateDistribution(workspace, scope === distro_1.SCOPE.PROJECT ? project : null, data.distribution_id, body);
63
64
  if (options.format === 'json') {
@@ -7,6 +7,7 @@ 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 cliError_1 = __importDefault(require("../../cliError"));
10
11
  const sortDomains = (arr, sort) => {
11
12
  return arr.sort((a, b) => {
12
13
  if (sort === 'name') {
@@ -20,13 +21,14 @@ const sortDomains = (arr, sort) => {
20
21
  return 0;
21
22
  });
22
23
  };
23
- const commandDomainBuy = (0, utils_1.newCommand)('buy', texts_1.DESC_COMMAND_DOMAIN_BUY);
24
+ const commandDomainBuy = (0, utils_1.newCommand)('buy', texts_1.DESC_COMMAND_DOMAIN_BUY, { requiredScopes: [utils_1.REST_API_SCOPE.DOMAIN_MANAGE] });
24
25
  commandDomainBuy.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
25
26
  commandDomainBuy.option('-d, --tld <tld...>', texts_1.OPT_COMMAND_DOMAIN_BUY_TLD);
26
27
  commandDomainBuy.option('-o, --owner-behalf', texts_1.OPT_COMMAND_DOMAIN_BUY_OWNER);
27
28
  commandDomainBuy.option('-s, --sort <name|price>', texts_1.OPT_COMMAND_DOMAIN_SORT);
28
29
  commandDomainBuy.option('-f, --force', texts_1.OPTION_CONFIRM_DOMAIN_BUY);
29
30
  commandDomainBuy.option('-a, --only-available', texts_1.OPT_COMMAND_DOMAIN_ONLY_AVAILABLE);
31
+ commandDomainBuy.option('--format <text|json>', texts_1.OPTION_FORMAT);
30
32
  commandDomainBuy.argument('[domain|prompt]', texts_1.OPT_COMMAND_DOMAIN_PHRASE);
31
33
  commandDomainBuy.action(async (text, options) => {
32
34
  const onlyAvailable = options.onlyAvailable;
@@ -36,11 +38,16 @@ commandDomainBuy.action(async (text, options) => {
36
38
  const tlds = input_1.default.allowedTlds(options.tld);
37
39
  const prompt = (text || '').trim().toLowerCase();
38
40
  const onOwnerBehalf = !!options.ownerBehalf;
39
- if (output_1.default.isTTY() && !options.force) {
41
+ const json = options.format === 'json';
42
+ if (options.force) {
43
+ await nonInteractive(client, workspace, prompt, tlds, onOwnerBehalf, json);
44
+ }
45
+ else if (output_1.default.isTTY() && !json) {
40
46
  await interactive(client, workspace, prompt, tlds, onOwnerBehalf, onlyAvailable, sort);
41
47
  }
42
48
  else {
43
- await nonInteractive(client, workspace, prompt, tlds, onOwnerBehalf);
49
+ // buying spends money, so only the menu or --force may pick the domain
50
+ throw new cliError_1.default('usage_error', texts_1.ERR_CONFIRM_REQUIRED, texts_1.TXT_CONFIRM_FORCE_HINT);
44
51
  }
45
52
  output_1.default.exitNormal();
46
53
  });
@@ -67,19 +74,28 @@ const outputBought = (domain) => {
67
74
  output_1.default.normal(' bought');
68
75
  outputRouteExample(domain);
69
76
  };
70
- const claimNonInteractive = async (client, workspace, domain, onOwnerBehalf) => {
77
+ const claimNonInteractive = async (client, workspace, domain, onOwnerBehalf, json) => {
78
+ if (json) {
79
+ output_1.default.json(await client.domainClaim(workspace, domain, onOwnerBehalf));
80
+ return;
81
+ }
71
82
  output_1.default.arrowSign();
72
83
  output_1.default.normal(`Matched: ${output_1.default.formatDomainClaim(domain, true)}`);
73
84
  await client.domainClaim(workspace, domain, onOwnerBehalf);
74
85
  outputClaimed(domain);
75
86
  };
76
- const buyNonInteractive = async (client, workspace, domain, onOwnerBehalf) => {
87
+ const buyNonInteractive = async (client, workspace, domain, onOwnerBehalf, json) => {
88
+ if (!domain?.available) {
89
+ throw new cliError_1.default('usage_error', texts_1.ERR_COMMAND_DOMAIN_UNAVAILABLE);
90
+ }
91
+ if (json) {
92
+ output_1.default.json(await client.domainBuy(workspace, domain.name, onOwnerBehalf, true));
93
+ return;
94
+ }
77
95
  output_1.default.arrowSign();
78
96
  output_1.default.normal(`Matched: ${output_1.default.formatDomain(domain)}`);
79
- if (domain.available) {
80
- await client.domainBuy(workspace, domain.name, onOwnerBehalf, true);
81
- outputBought(domain.name);
82
- }
97
+ await client.domainBuy(workspace, domain.name, onOwnerBehalf, true);
98
+ outputBought(domain.name);
83
99
  };
84
100
  const interactive = async (client, workspace, prompt, tlds, onOwnerBehalf, onlyAvailable, sort) => {
85
101
  if (!prompt) {
@@ -264,7 +280,7 @@ const interactive = async (client, workspace, prompt, tlds, onOwnerBehalf, onlyA
264
280
  outputBought(name);
265
281
  }
266
282
  };
267
- const nonInteractive = async (client, workspace, prompt, tlds, onOwnerBehalf) => {
283
+ const nonInteractive = async (client, workspace, prompt, tlds, onOwnerBehalf, json) => {
268
284
  if (!prompt) {
269
285
  output_1.default.exitError(texts_1.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED);
270
286
  }
@@ -273,19 +289,22 @@ const nonInteractive = async (client, workspace, prompt, tlds, onOwnerBehalf) =>
273
289
  const claims = await client.domainClaimable(workspace, subdomain);
274
290
  const claimable = claims.domains.find((c) => c.available && `${subdomain}.${c.domain}` === prompt);
275
291
  if (claimable) {
276
- await claimNonInteractive(client, workspace, prompt, onOwnerBehalf);
292
+ await claimNonInteractive(client, workspace, prompt, onOwnerBehalf, json);
277
293
  return;
278
294
  }
279
295
  const { domains } = await client.domainSearch(workspace, [prompt]);
280
- await buyNonInteractive(client, workspace, domains[0], onOwnerBehalf);
296
+ await buyNonInteractive(client, workspace, domains[0], onOwnerBehalf, json);
281
297
  return;
282
298
  }
283
- output_1.default.arrowSign();
284
- output_1.default.normal(`Searching...`);
299
+ if (!json) {
300
+ output_1.default.arrowSign();
301
+ output_1.default.normal(`Searching...`);
302
+ }
285
303
  const suggestions = await client.domainSuggest(workspace, prompt, tlds, 5);
286
- output_1.default.clearPreviousLine();
304
+ if (!json)
305
+ output_1.default.clearPreviousLine();
287
306
  if (suggestions.claims.length > 0) {
288
- await claimNonInteractive(client, workspace, suggestions.claims[0], onOwnerBehalf);
307
+ await claimNonInteractive(client, workspace, suggestions.claims[0], onOwnerBehalf, json);
289
308
  return;
290
309
  }
291
310
  const domains = suggestions.domains.sort((a, b) => {
@@ -296,7 +315,7 @@ const nonInteractive = async (client, workspace, prompt, tlds, onOwnerBehalf) =>
296
315
  return a.prices.create.price < b.prices.create.price ? -1 : 1;
297
316
  });
298
317
  if (domains.length > 0) {
299
- await buyNonInteractive(client, workspace, domains[0], onOwnerBehalf);
318
+ await buyNonInteractive(client, workspace, domains[0], onOwnerBehalf, json);
300
319
  return;
301
320
  }
302
321
  output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
@@ -3,11 +3,12 @@ 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"));
9
10
  const output_1 = __importDefault(require("../../output"));
10
- const commandDomainGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_DOMAIN_GET);
11
+ const commandDomainGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_DOMAIN_GET, { requiredScopes: [utils_1.REST_API_SCOPE.DOMAIN_READ] });
11
12
  commandDomainGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
12
13
  commandDomainGet.option('--format <text|json>', texts_1.OPTION_FORMAT);
13
14
  commandDomainGet.argument('<id|name>', texts_1.OPTION_COMMAND_DOMAIN_IDENTIFIER);
@@ -26,7 +27,7 @@ commandDomainGet.action(async (name, options) => {
26
27
  }
27
28
  }
28
29
  if (!domain) {
29
- output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
30
+ output_1.default.exitError(new cliError_1.default('not_found', texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND, texts_1.HINT_DOMAIN_LIST));
30
31
  }
31
32
  if (options.format === 'json') {
32
33
  output_1.default.json(domain);
@@ -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 commandDomainList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_DOMAIN_LIST);
10
+ const commandDomainList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_DOMAIN_LIST, { requiredScopes: [utils_1.REST_API_SCOPE.DOMAIN_READ] });
11
11
  commandDomainList.alias('ls');
12
12
  commandDomainList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
13
13
  commandDomainList.option('--format <text|json>', texts_1.OPTION_FORMAT);
@@ -9,9 +9,11 @@ const input_1 = __importDefault(require("../../input"));
9
9
  const output_1 = __importDefault(require("../../output"));
10
10
  const cliError_1 = __importDefault(require("../../cliError"));
11
11
  const commandDomainOpen = (0, utils_1.newCommand)('open', texts_1.DESC_COMMAND_RESOURCE_OPEN, {
12
+ requiredScopes: [utils_1.REST_API_SCOPE.DOMAIN_READ],
12
13
  examples: [{ description: 'Open a domain in Buddy', command: 'bdy domain open example.com' }],
13
14
  });
14
15
  commandDomainOpen.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
16
+ commandDomainOpen.option('--format <text|json>', texts_1.OPTION_FORMAT);
15
17
  commandDomainOpen.argument('<id|name>', texts_1.OPTION_COMMAND_DOMAIN_IDENTIFIER);
16
18
  commandDomainOpen.action(async (name, options) => {
17
19
  const workspace = input_1.default.restApiWorkspace(options.workspace);
@@ -27,7 +29,7 @@ commandDomainOpen.action(async (name, options) => {
27
29
  domain = await client.getDomain(workspace, found.id);
28
30
  }
29
31
  if (!domain)
30
- throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
31
- await output_1.default.openUrl(domain.html_url);
32
+ throw new cliError_1.default('not_found', texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND, texts_1.HINT_DOMAIN_LIST);
33
+ await output_1.default.openUrl(domain.html_url, options.format === 'json');
32
34
  });
33
35
  exports.default = commandDomainOpen;
@@ -21,6 +21,7 @@ const sort = (arr, sort) => {
21
21
  });
22
22
  };
23
23
  const commandDomainSearch = (0, utils_1.newCommand)('search', texts_1.DESC_COMMAND_DOMAIN_SEARCH, {
24
+ requiredScopes: [utils_1.REST_API_SCOPE.DOMAIN_READ],
24
25
  helpText: texts_1.HELP_DOMAIN_SEARCH_JSON,
25
26
  examples: texts_1.EXAMPLE_DOMAIN_SEARCH,
26
27
  });