bdy 1.17.29-dev → 1.18.1-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.
- package/distTs/package.json +1 -1
- package/distTs/src/api/client.js +70 -6
- package/distTs/src/command/domain/buy.js +187 -0
- package/distTs/src/command/domain/get.js +45 -0
- package/distTs/src/command/domain/list.js +27 -0
- package/distTs/src/command/domain/search.js +91 -0
- package/distTs/src/command/domain.js +17 -0
- package/distTs/src/command/project/link.js +1 -1
- package/distTs/src/index.js +2 -0
- package/distTs/src/input.js +10 -1
- package/distTs/src/output.js +49 -8
- package/distTs/src/texts.js +20 -4
- package/distTs/src/utils.js +75 -0
- package/package.json +1 -1
package/distTs/package.json
CHANGED
package/distTs/src/api/client.js
CHANGED
|
@@ -253,7 +253,7 @@ class ApiClient {
|
|
|
253
253
|
method: 'POST',
|
|
254
254
|
path: `/workspaces/${encodeURIComponent(workspace)}/projects`,
|
|
255
255
|
body,
|
|
256
|
-
parseResponseBody: true
|
|
256
|
+
parseResponseBody: true,
|
|
257
257
|
});
|
|
258
258
|
}
|
|
259
259
|
async pipelineRun(workspace, project, pipelineId, body) {
|
|
@@ -278,14 +278,14 @@ class ApiClient {
|
|
|
278
278
|
method: 'POST',
|
|
279
279
|
path: `/workspaces/${encodeURIComponent(workspace)}/sandboxes/yaml?project_name=${encodeURIComponent(project)}`,
|
|
280
280
|
body,
|
|
281
|
-
parseResponseBody: true
|
|
281
|
+
parseResponseBody: true,
|
|
282
282
|
});
|
|
283
283
|
}
|
|
284
284
|
async getSandboxYaml(workspace, sandboxId) {
|
|
285
285
|
return await this.request({
|
|
286
286
|
method: 'GET',
|
|
287
287
|
path: `/workspaces/${encodeURIComponent(workspace)}/sandboxes/${encodeURIComponent(sandboxId)}/yaml`,
|
|
288
|
-
parseResponseBody: true
|
|
288
|
+
parseResponseBody: true,
|
|
289
289
|
});
|
|
290
290
|
}
|
|
291
291
|
async updateSandboxByYaml(workspace, sandboxId, body) {
|
|
@@ -293,7 +293,7 @@ class ApiClient {
|
|
|
293
293
|
method: 'PATCH',
|
|
294
294
|
path: `/workspaces/${encodeURIComponent(workspace)}/sandboxes/${encodeURIComponent(sandboxId)}/yaml`,
|
|
295
295
|
body,
|
|
296
|
-
parseResponseBody: true
|
|
296
|
+
parseResponseBody: true,
|
|
297
297
|
});
|
|
298
298
|
}
|
|
299
299
|
async sandboxDownloadFile(workspace, sandboxId, remotePath) {
|
|
@@ -359,6 +359,70 @@ class ApiClient {
|
|
|
359
359
|
parseResponseBody: true,
|
|
360
360
|
});
|
|
361
361
|
}
|
|
362
|
+
async domainBuy(workspace, name, onOwnerBehalf = false, autoRenew = true) {
|
|
363
|
+
return await this.request({
|
|
364
|
+
method: 'POST',
|
|
365
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/register`,
|
|
366
|
+
body: {
|
|
367
|
+
name,
|
|
368
|
+
on_owner_behalf: onOwnerBehalf,
|
|
369
|
+
auto_renew: autoRenew,
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
async domainClaim(workspace, name, onOwnerBehalf = false) {
|
|
374
|
+
return await this.request({
|
|
375
|
+
method: 'POST',
|
|
376
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/claim`,
|
|
377
|
+
body: {
|
|
378
|
+
name,
|
|
379
|
+
on_owner_behalf: onOwnerBehalf,
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
async domainSearch(workspace, domains) {
|
|
384
|
+
return await this.request({
|
|
385
|
+
method: 'POST',
|
|
386
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/search`,
|
|
387
|
+
body: { domains },
|
|
388
|
+
parseResponseBody: true,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
async getDomains(workspace) {
|
|
392
|
+
return await this.request({
|
|
393
|
+
method: 'GET',
|
|
394
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains`,
|
|
395
|
+
parseResponseBody: true,
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
async getDomain(workspace, id) {
|
|
399
|
+
return await this.request({
|
|
400
|
+
method: 'GET',
|
|
401
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/${encodeURIComponent(id)}`,
|
|
402
|
+
parseResponseBody: true,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
async domainSuggest(workspace, prompt, tlds, limit) {
|
|
406
|
+
const body = {
|
|
407
|
+
prompt,
|
|
408
|
+
limit,
|
|
409
|
+
};
|
|
410
|
+
if (tlds.length > 0)
|
|
411
|
+
body.tlds = tlds;
|
|
412
|
+
return await this.request({
|
|
413
|
+
method: 'POST',
|
|
414
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/suggest`,
|
|
415
|
+
body,
|
|
416
|
+
parseResponseBody: true,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
async domainClaimable(workspace, name) {
|
|
420
|
+
return await this.request({
|
|
421
|
+
method: 'GET',
|
|
422
|
+
path: `/workspaces/${encodeURIComponent(workspace)}/domains/claimable/${encodeURIComponent(name)}`,
|
|
423
|
+
parseResponseBody: true,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
362
426
|
async registerApp(name, redirectUrl) {
|
|
363
427
|
return await this.request({
|
|
364
428
|
method: 'POST',
|
|
@@ -569,7 +633,7 @@ class ApiClient {
|
|
|
569
633
|
return await this.request({
|
|
570
634
|
method: 'GET',
|
|
571
635
|
path: `/workspaces/${encodeURIComponent(workspace)}/projects/${encodeURIComponent(project)}`,
|
|
572
|
-
parseResponseBody: true
|
|
636
|
+
parseResponseBody: true,
|
|
573
637
|
});
|
|
574
638
|
}
|
|
575
639
|
async getProjects(workspace, page = 1, perPage = 100) {
|
|
@@ -626,7 +690,7 @@ class ApiClient {
|
|
|
626
690
|
async getSandboxByIdentifier(workspace, project, sandbox) {
|
|
627
691
|
const opts = {
|
|
628
692
|
project,
|
|
629
|
-
sandbox
|
|
693
|
+
sandbox,
|
|
630
694
|
};
|
|
631
695
|
return await this.getResourceByIdentifier(workspace, opts);
|
|
632
696
|
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const texts_1 = require("../../texts");
|
|
8
|
+
const output_1 = __importDefault(require("../../output"));
|
|
9
|
+
const input_1 = __importDefault(require("../../input"));
|
|
10
|
+
const commandDomainBuy = (0, utils_1.newCommand)('buy', texts_1.DESC_COMMAND_DOMAIN_BUY);
|
|
11
|
+
commandDomainBuy.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandDomainBuy.option('-d, --tld <tld...>', texts_1.OPT_COMMAND_DOMAIN_BUY_TLD);
|
|
13
|
+
commandDomainBuy.option('-o, --owner-behalf', texts_1.OPT_COMMAND_DOMAIN_BUY_OWNER);
|
|
14
|
+
commandDomainBuy.argument('[domain|prompt]', texts_1.OPT_COMMAND_DOMAIN_PHRASE);
|
|
15
|
+
commandDomainBuy.action(async (text, options) => {
|
|
16
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
17
|
+
const client = input_1.default.restApiTokenClient();
|
|
18
|
+
const tlds = input_1.default.allowedTlds(options.tld);
|
|
19
|
+
const prompt = (text || '').trim().toLowerCase();
|
|
20
|
+
const onOwnerBehalf = !!options.ownerBehalf;
|
|
21
|
+
if (output_1.default.isTTY()) {
|
|
22
|
+
await interactive(client, workspace, prompt, tlds, onOwnerBehalf);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
await nonInteractive(client, workspace, prompt, tlds, onOwnerBehalf);
|
|
26
|
+
}
|
|
27
|
+
output_1.default.exitNormal();
|
|
28
|
+
});
|
|
29
|
+
const claimNonInteractive = async (client, workspace, domain, onOwnerBehalf) => {
|
|
30
|
+
output_1.default.arrowSign();
|
|
31
|
+
output_1.default.normal(`Matched: ${output_1.default.formatDomainClaim(domain, true)}`);
|
|
32
|
+
await client.domainClaim(workspace, domain, onOwnerBehalf);
|
|
33
|
+
output_1.default.okSign();
|
|
34
|
+
output_1.default.normal(`${domain} claimed`);
|
|
35
|
+
};
|
|
36
|
+
const buyNonInteractive = async (client, workspace, domain, onOwnerBehalf) => {
|
|
37
|
+
output_1.default.arrowSign();
|
|
38
|
+
output_1.default.normal(`Matched: ${output_1.default.formatDomain(domain)}`);
|
|
39
|
+
if (domain.available && !domain.premium) {
|
|
40
|
+
await client.domainBuy(workspace, domain.name, onOwnerBehalf, true);
|
|
41
|
+
output_1.default.okSign();
|
|
42
|
+
output_1.default.normal(`${domain.name} bought`);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const interactive = async (client, workspace, prompt, tlds, onOwnerBehalf) => {
|
|
46
|
+
if (!prompt) {
|
|
47
|
+
prompt = await output_1.default.inputString(texts_1.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT);
|
|
48
|
+
}
|
|
49
|
+
if (!prompt) {
|
|
50
|
+
output_1.default.exitError(texts_1.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED);
|
|
51
|
+
}
|
|
52
|
+
output_1.default.arrowSign();
|
|
53
|
+
output_1.default.normal(`Searching...`);
|
|
54
|
+
let items = [];
|
|
55
|
+
const createValue = (type, name, available) => {
|
|
56
|
+
return `${type}:${name}:${available ? '1' : '0'}`;
|
|
57
|
+
};
|
|
58
|
+
if ((0, utils_1.isValidDomain)(prompt)) {
|
|
59
|
+
const subdomain = (0, utils_1.getSubdomain)(prompt);
|
|
60
|
+
const claims = await client.domainClaimable(workspace, subdomain);
|
|
61
|
+
const claimable = claims.domains.find((c) => `${subdomain}.${c.domain}` === prompt);
|
|
62
|
+
if (claimable) {
|
|
63
|
+
items.push(output_1.default.createMenuSeparator('Matched'));
|
|
64
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomainClaim(prompt, claimable.available), createValue('claim', prompt, claimable.available)));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const search = await client.domainSearch(workspace, [prompt]);
|
|
68
|
+
const buyable = search.domains.find((d) => d.name === prompt);
|
|
69
|
+
if (buyable) {
|
|
70
|
+
items.push(output_1.default.createMenuSeparator('Matched'));
|
|
71
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomain(buyable), createValue('domain', prompt, buyable.available && !buyable.premium)));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if ((0, utils_1.isValidSubdomain)(prompt)) {
|
|
76
|
+
const claims = await client.domainClaimable(workspace, prompt);
|
|
77
|
+
const domains = [];
|
|
78
|
+
const popularTlds = (0, utils_1.getPopularTlds)();
|
|
79
|
+
const searchTlds = tlds.length > 0 ? tlds : popularTlds;
|
|
80
|
+
searchTlds.forEach((tld) => {
|
|
81
|
+
domains.push(`${prompt}.${tld}`);
|
|
82
|
+
});
|
|
83
|
+
const search = await client.domainSearch(workspace, domains);
|
|
84
|
+
if (claims.domains.length > 0 || search.domains.length > 0) {
|
|
85
|
+
const claimsAvailable = claims.domains.filter((c) => (c.available && !tlds.length) || tlds.includes(c.domain));
|
|
86
|
+
const claimsUnavailable = claims.domains.filter((c) => (!c.available && !tlds.length) || tlds.includes(c.domain));
|
|
87
|
+
search.domains = search.domains.sort((a, b) => {
|
|
88
|
+
const aTld = (0, utils_1.getDomainTld)(a.name);
|
|
89
|
+
const bTld = (0, utils_1.getDomainTld)(b.name);
|
|
90
|
+
const aIdx = popularTlds.indexOf(aTld);
|
|
91
|
+
const bIdx = popularTlds.indexOf(bTld);
|
|
92
|
+
return aIdx < bIdx ? -1 : 1;
|
|
93
|
+
});
|
|
94
|
+
const domainsAvailable = search.domains.filter((d) => d.available && !d.premium);
|
|
95
|
+
const domainsUnavailable = search.domains.filter((d) => !d.available || d.premium);
|
|
96
|
+
domainsAvailable.forEach((d) => {
|
|
97
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomain(d), createValue('domain', d.name, true)));
|
|
98
|
+
});
|
|
99
|
+
claimsAvailable.forEach((c, i) => {
|
|
100
|
+
const domain = `${prompt}.${c.domain}`;
|
|
101
|
+
const item = output_1.default.createMenuItem(output_1.default.formatDomainClaim(domain, true), createValue('claim', domain, true));
|
|
102
|
+
if (i < 5)
|
|
103
|
+
items.unshift(item);
|
|
104
|
+
else
|
|
105
|
+
items.push(item);
|
|
106
|
+
});
|
|
107
|
+
domainsUnavailable.forEach((d) => {
|
|
108
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomain(d), createValue('domain', d.name, false)));
|
|
109
|
+
});
|
|
110
|
+
claimsUnavailable.forEach((c) => {
|
|
111
|
+
const domain = `${prompt}.${c.domain}`;
|
|
112
|
+
const item = output_1.default.createMenuItem(output_1.default.formatDomainClaim(domain, false), createValue('claim', domain, false));
|
|
113
|
+
items.push(item);
|
|
114
|
+
});
|
|
115
|
+
if (items.length > 10)
|
|
116
|
+
items = items.filter((_, i) => i < 10);
|
|
117
|
+
items.unshift(output_1.default.createMenuSeparator('Matched'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const suggestions = await client.domainSuggest(workspace, prompt, tlds, 5);
|
|
121
|
+
if (suggestions.domains.length > 0 || suggestions.claims.length > 0) {
|
|
122
|
+
items.push(output_1.default.createMenuSeparator('Suggestions'));
|
|
123
|
+
let i = 0;
|
|
124
|
+
suggestions.claims.forEach((c) => {
|
|
125
|
+
if (i >= 10)
|
|
126
|
+
return;
|
|
127
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomainClaim(c, true), createValue('claim', c, true)));
|
|
128
|
+
i += 1;
|
|
129
|
+
});
|
|
130
|
+
suggestions.domains.forEach((d) => {
|
|
131
|
+
if (i >= 10)
|
|
132
|
+
return;
|
|
133
|
+
items.push(output_1.default.createMenuItem(output_1.default.formatDomain(d), createValue('domain', d.name, true)));
|
|
134
|
+
i += 1;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
output_1.default.clearPreviousLine();
|
|
138
|
+
if (!items.length) {
|
|
139
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
|
|
140
|
+
}
|
|
141
|
+
const value = await output_1.default.inputMenuAdv(texts_1.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN, items);
|
|
142
|
+
const [type, name, available] = value.split(':');
|
|
143
|
+
if (available !== '1') {
|
|
144
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_UNAVAILABLE);
|
|
145
|
+
}
|
|
146
|
+
else if (type === 'claim') {
|
|
147
|
+
await client.domainClaim(workspace, name, onOwnerBehalf);
|
|
148
|
+
output_1.default.okSign();
|
|
149
|
+
output_1.default.normal(`${name} claimed`);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
await client.domainBuy(workspace, name, onOwnerBehalf);
|
|
153
|
+
output_1.default.okSign();
|
|
154
|
+
output_1.default.normal(`${name} bought`);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const nonInteractive = async (client, workspace, prompt, tlds, onOwnerBehalf) => {
|
|
158
|
+
if (!prompt) {
|
|
159
|
+
output_1.default.exitError(texts_1.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED);
|
|
160
|
+
}
|
|
161
|
+
if ((0, utils_1.isValidDomain)(prompt)) {
|
|
162
|
+
const subdomain = (0, utils_1.getSubdomain)(prompt);
|
|
163
|
+
const claims = await client.domainClaimable(workspace, subdomain);
|
|
164
|
+
const claimable = claims.domains.find((c) => c.available && `${subdomain}.${c.domain}` === prompt);
|
|
165
|
+
if (claimable) {
|
|
166
|
+
await claimNonInteractive(client, workspace, prompt, onOwnerBehalf);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const { domains } = await client.domainSearch(workspace, [prompt]);
|
|
170
|
+
await buyNonInteractive(client, workspace, domains[0], onOwnerBehalf);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
output_1.default.arrowSign();
|
|
174
|
+
output_1.default.normal(`Searching...`);
|
|
175
|
+
const suggestions = await client.domainSuggest(workspace, prompt, tlds, 5);
|
|
176
|
+
output_1.default.clearPreviousLine();
|
|
177
|
+
if (suggestions.claims.length > 0) {
|
|
178
|
+
await claimNonInteractive(client, workspace, suggestions.claims[0], onOwnerBehalf);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (suggestions.domains.length > 0) {
|
|
182
|
+
await buyNonInteractive(client, workspace, suggestions.domains[0], onOwnerBehalf);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
|
|
186
|
+
};
|
|
187
|
+
exports.default = commandDomainBuy;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const texts_1 = require("../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../output"));
|
|
10
|
+
const commandDomainGet = (0, utils_1.newCommand)('get', texts_1.DESC_COMMAND_DOMAIN_GET);
|
|
11
|
+
commandDomainGet.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandDomainGet.argument('<id|name>', texts_1.OPTION_COMMAND_DOMAIN_IDENTIFIER);
|
|
13
|
+
commandDomainGet.action(async (name, options) => {
|
|
14
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
15
|
+
const client = input_1.default.restApiTokenClient();
|
|
16
|
+
let domain;
|
|
17
|
+
try {
|
|
18
|
+
domain = await client.getDomain(workspace, name);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
const response = await client.getDomains(workspace);
|
|
22
|
+
domain = (response.domains || []).find((d) => d.name === name);
|
|
23
|
+
if (domain) {
|
|
24
|
+
domain = await client.getDomain(workspace, domain.id);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (!domain) {
|
|
28
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
|
|
29
|
+
}
|
|
30
|
+
const props = {
|
|
31
|
+
Name: domain.name,
|
|
32
|
+
ID: domain.id,
|
|
33
|
+
Type: domain.type,
|
|
34
|
+
};
|
|
35
|
+
if (domain.type === 'REGISTERED') {
|
|
36
|
+
if (domain.expiry_date) {
|
|
37
|
+
props.Expires = domain.expiry_date;
|
|
38
|
+
}
|
|
39
|
+
props.Renew = domain.auto_renew ? 'Auto' : 'Manual';
|
|
40
|
+
}
|
|
41
|
+
props.URL = domain.html_url;
|
|
42
|
+
output_1.default.object(props);
|
|
43
|
+
output_1.default.exitNormal();
|
|
44
|
+
});
|
|
45
|
+
exports.default = commandDomainGet;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const texts_1 = require("../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../output"));
|
|
10
|
+
const commandDomainList = (0, utils_1.newCommand)('list', texts_1.DESC_COMMAND_DOMAIN_LIST);
|
|
11
|
+
commandDomainList.alias('ls');
|
|
12
|
+
commandDomainList.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
13
|
+
commandDomainList.action(async (options) => {
|
|
14
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
15
|
+
const client = input_1.default.restApiTokenClient();
|
|
16
|
+
const response = await client.getDomains(workspace);
|
|
17
|
+
if (!response.domains || response.domains.length === 0) {
|
|
18
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NO_DOMAINS);
|
|
19
|
+
}
|
|
20
|
+
const data = [['NAME', 'ID', 'URL']];
|
|
21
|
+
for (const d of response.domains) {
|
|
22
|
+
data.push([d.name, d.id, d.html_url]);
|
|
23
|
+
}
|
|
24
|
+
output_1.default.table(data);
|
|
25
|
+
output_1.default.exitNormal();
|
|
26
|
+
});
|
|
27
|
+
exports.default = commandDomainList;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../../utils");
|
|
7
|
+
const texts_1 = require("../../texts");
|
|
8
|
+
const input_1 = __importDefault(require("../../input"));
|
|
9
|
+
const output_1 = __importDefault(require("../../output"));
|
|
10
|
+
const commandDomainSearch = (0, utils_1.newCommand)('search', texts_1.DESC_COMMAND_DOMAIN_SEARCH);
|
|
11
|
+
commandDomainSearch.option('-w, --workspace <domain>', texts_1.OPTION_REST_API_WORKSPACE);
|
|
12
|
+
commandDomainSearch.option('-d, --tld <tld...>', texts_1.OPT_COMMAND_DOMAIN_BUY_TLD);
|
|
13
|
+
commandDomainSearch.argument('[domain|prompt]', texts_1.OPT_COMMAND_DOMAIN_PHRASE);
|
|
14
|
+
commandDomainSearch.action(async (text, options) => {
|
|
15
|
+
const workspace = input_1.default.restApiWorkspace(options.workspace);
|
|
16
|
+
const client = input_1.default.restApiTokenClient();
|
|
17
|
+
const tlds = input_1.default.allowedTlds(options.tld);
|
|
18
|
+
let prompt = (text || '').trim().toLowerCase();
|
|
19
|
+
if (output_1.default.isTTY() && !prompt) {
|
|
20
|
+
prompt = await output_1.default.inputString(texts_1.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT);
|
|
21
|
+
}
|
|
22
|
+
if (!prompt) {
|
|
23
|
+
output_1.default.exitError(texts_1.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED);
|
|
24
|
+
}
|
|
25
|
+
output_1.default.arrowSign();
|
|
26
|
+
output_1.default.normal(`Searching...`);
|
|
27
|
+
const matched = [];
|
|
28
|
+
if ((0, utils_1.isValidDomain)(prompt)) {
|
|
29
|
+
const subdomain = (0, utils_1.getSubdomain)(prompt);
|
|
30
|
+
const claims = await client.domainClaimable(workspace, subdomain);
|
|
31
|
+
const claimable = claims.domains.find((c) => `${subdomain}.${c.domain}` === prompt);
|
|
32
|
+
if (claimable) {
|
|
33
|
+
matched.push(output_1.default.formatDomainClaim(prompt, claimable.available));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const search = await client.domainSearch(workspace, [prompt]);
|
|
37
|
+
const buyable = search.domains.find((d) => d.name === prompt);
|
|
38
|
+
if (buyable) {
|
|
39
|
+
matched.push(output_1.default.formatDomain(buyable));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if ((0, utils_1.isValidSubdomain)(prompt)) {
|
|
44
|
+
const claims = await client.domainClaimable(workspace, prompt);
|
|
45
|
+
const domains = [];
|
|
46
|
+
const popularTlds = (0, utils_1.getPopularTlds)();
|
|
47
|
+
const searchTlds = tlds.length > 0 ? tlds : popularTlds;
|
|
48
|
+
searchTlds.forEach((tld) => {
|
|
49
|
+
domains.push(`${prompt}.${tld}`);
|
|
50
|
+
});
|
|
51
|
+
const search = await client.domainSearch(workspace, domains);
|
|
52
|
+
search.domains = search.domains.sort((a, b) => {
|
|
53
|
+
const aTld = (0, utils_1.getDomainTld)(a.name);
|
|
54
|
+
const bTld = (0, utils_1.getDomainTld)(b.name);
|
|
55
|
+
const aIdx = popularTlds.indexOf(aTld);
|
|
56
|
+
const bIdx = popularTlds.indexOf(bTld);
|
|
57
|
+
return aIdx < bIdx ? -1 : 1;
|
|
58
|
+
});
|
|
59
|
+
claims.domains.forEach((c) => {
|
|
60
|
+
matched.push(output_1.default.formatDomainClaim(`${prompt}.${c.domain}`, c.available));
|
|
61
|
+
});
|
|
62
|
+
search.domains.forEach((d) => {
|
|
63
|
+
matched.push(output_1.default.formatDomain(d));
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
const result = await client.domainSuggest(workspace, prompt, tlds, 5);
|
|
67
|
+
output_1.default.clearPreviousLine();
|
|
68
|
+
let hasAny = false;
|
|
69
|
+
if (matched.length > 0) {
|
|
70
|
+
hasAny = true;
|
|
71
|
+
output_1.default.normal('Matched');
|
|
72
|
+
matched.forEach((m) => {
|
|
73
|
+
output_1.default.normal(m);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (result.domains.length > 0 || result.claims.length > 0) {
|
|
77
|
+
hasAny = true;
|
|
78
|
+
output_1.default.normal('Suggestions');
|
|
79
|
+
result.claims.forEach((c) => {
|
|
80
|
+
output_1.default.normal(output_1.default.formatDomainClaim(c, true));
|
|
81
|
+
});
|
|
82
|
+
result.domains.forEach((d) => {
|
|
83
|
+
output_1.default.normal(output_1.default.formatDomain(d));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (!hasAny)
|
|
87
|
+
output_1.default.exitError(texts_1.ERR_COMMAND_DOMAIN_NOT_FOUND);
|
|
88
|
+
else
|
|
89
|
+
output_1.default.exitNormal();
|
|
90
|
+
});
|
|
91
|
+
exports.default = commandDomainSearch;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const utils_1 = require("../utils");
|
|
7
|
+
const texts_1 = require("../texts");
|
|
8
|
+
const buy_1 = __importDefault(require("./domain/buy"));
|
|
9
|
+
const list_1 = __importDefault(require("./domain/list"));
|
|
10
|
+
const get_1 = __importDefault(require("./domain/get"));
|
|
11
|
+
const search_1 = __importDefault(require("./domain/search"));
|
|
12
|
+
const commandDomain = (0, utils_1.newCommand)('domain', texts_1.DESC_COMMAND_DOMAIN);
|
|
13
|
+
commandDomain.addCommand(buy_1.default);
|
|
14
|
+
commandDomain.addCommand(search_1.default);
|
|
15
|
+
commandDomain.addCommand(list_1.default);
|
|
16
|
+
commandDomain.addCommand(get_1.default);
|
|
17
|
+
exports.default = commandDomain;
|
|
@@ -51,7 +51,7 @@ const getRemoteNames = (str) => {
|
|
|
51
51
|
return names;
|
|
52
52
|
};
|
|
53
53
|
const tryNow = () => {
|
|
54
|
-
output_1.default.
|
|
54
|
+
output_1.default.arrowSign();
|
|
55
55
|
output_1.default.label(texts_1.OPT_COMMAND_PROJECT_LINK_TRY_NOW);
|
|
56
56
|
output_1.default.dim('$ ', false);
|
|
57
57
|
output_1.default.light('bdy tunnel http 3000 ', false);
|
package/distTs/src/index.js
CHANGED
|
@@ -25,6 +25,7 @@ const package_1 = __importDefault(require("./command/package"));
|
|
|
25
25
|
const api_1 = __importDefault(require("./command/api"));
|
|
26
26
|
const autocomplete_1 = __importDefault(require("./autocomplete"));
|
|
27
27
|
const autocomplete_2 = __importDefault(require("./command/autocomplete"));
|
|
28
|
+
const domain_1 = __importDefault(require("./command/domain"));
|
|
28
29
|
stream_1.default.setDefaultHighWaterMark(false, 67108864);
|
|
29
30
|
process.title = 'bdy';
|
|
30
31
|
process.on('uncaughtException', (err) => {
|
|
@@ -45,6 +46,7 @@ program.addCommand(ut_1.default);
|
|
|
45
46
|
program.addCommand(pipeline_1.default);
|
|
46
47
|
program.addCommand(package_1.default);
|
|
47
48
|
program.addCommand(sandbox_1.default);
|
|
49
|
+
program.addCommand(domain_1.default);
|
|
48
50
|
program.addCommand(login_1.default);
|
|
49
51
|
program.addCommand(whoami_1.default);
|
|
50
52
|
program.addCommand(logout_1.default);
|
package/distTs/src/input.js
CHANGED
|
@@ -326,6 +326,15 @@ class Input {
|
|
|
326
326
|
clientToken: ct,
|
|
327
327
|
};
|
|
328
328
|
}
|
|
329
|
+
static allowedTlds(tld) {
|
|
330
|
+
const result = [];
|
|
331
|
+
if (tld) {
|
|
332
|
+
tld.forEach((t) => {
|
|
333
|
+
result.push(...t.split(',').map((t) => t.replace(/^\./, '')));
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
329
338
|
static restApiTokenClient(allowNoToken = false, api = '', region = '', token = '') {
|
|
330
339
|
const baseUrl = this.restApiBaseUrl(api, region);
|
|
331
340
|
const { token: t, refreshToken, clientId, clientToken, clientSecret, } = this.restApiToken(allowNoToken, token);
|
|
@@ -730,7 +739,7 @@ class Input {
|
|
|
730
739
|
cfg_1.default.setToken(token);
|
|
731
740
|
return {
|
|
732
741
|
token,
|
|
733
|
-
host: d.host
|
|
742
|
+
host: d.host,
|
|
734
743
|
};
|
|
735
744
|
}
|
|
736
745
|
static keyCert(keyPath, certPath) {
|
package/distTs/src/output.js
CHANGED
|
@@ -66,9 +66,15 @@ class Output {
|
|
|
66
66
|
static getOkSign() {
|
|
67
67
|
return '✔ ';
|
|
68
68
|
}
|
|
69
|
+
static getArrowSign() {
|
|
70
|
+
return '→ ';
|
|
71
|
+
}
|
|
69
72
|
static okSign(newLine = false) {
|
|
70
73
|
return this.cyan(this.getOkSign(), newLine);
|
|
71
74
|
}
|
|
75
|
+
static arrowSign(newLine = false) {
|
|
76
|
+
return this.cyan(this.getArrowSign(), newLine);
|
|
77
|
+
}
|
|
72
78
|
static exitSuccess(msg) {
|
|
73
79
|
this.exitNormal(this.getGreenColor(msg));
|
|
74
80
|
}
|
|
@@ -217,7 +223,7 @@ class Output {
|
|
|
217
223
|
terminal.table(data, {
|
|
218
224
|
fit: false,
|
|
219
225
|
hasBorder: false,
|
|
220
|
-
firstRowTextAttr: { color: 'blue' }
|
|
226
|
+
firstRowTextAttr: { color: 'blue' },
|
|
221
227
|
});
|
|
222
228
|
}
|
|
223
229
|
static configTunnels(tunnels) {
|
|
@@ -244,7 +250,7 @@ class Output {
|
|
|
244
250
|
return await prompts_1.default.confirm({
|
|
245
251
|
message,
|
|
246
252
|
theme: this.getInquirerTheme(),
|
|
247
|
-
default: false
|
|
253
|
+
default: false,
|
|
248
254
|
});
|
|
249
255
|
}
|
|
250
256
|
this.cyan('? ', false);
|
|
@@ -257,7 +263,7 @@ class Output {
|
|
|
257
263
|
return await prompts_1.default.input({
|
|
258
264
|
message,
|
|
259
265
|
default: def,
|
|
260
|
-
theme: this.getInquirerTheme()
|
|
266
|
+
theme: this.getInquirerTheme(),
|
|
261
267
|
});
|
|
262
268
|
}
|
|
263
269
|
this.cyan('? ', false);
|
|
@@ -274,26 +280,61 @@ class Output {
|
|
|
274
280
|
return await prompts_1.default.select({
|
|
275
281
|
message,
|
|
276
282
|
theme: this.getInquirerTheme(),
|
|
277
|
-
|
|
283
|
+
loop: false,
|
|
284
|
+
choices: items,
|
|
278
285
|
});
|
|
279
286
|
}
|
|
280
287
|
else {
|
|
281
288
|
this.cyan('? ', false);
|
|
282
289
|
this.normal(message, false);
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
290
|
+
const item = items.find((item) => !prompts_1.default.Separator.isSeparator(item) && !item.disabled);
|
|
291
|
+
if (item && item.name && item.value) {
|
|
292
|
+
this.cyan(` ${item.name}`);
|
|
293
|
+
return item.value;
|
|
286
294
|
}
|
|
287
295
|
this.normal('');
|
|
288
296
|
return '';
|
|
289
297
|
}
|
|
290
298
|
}
|
|
299
|
+
static formatDomainPrice(price) {
|
|
300
|
+
const sign = price.currency === 'USD' ? '$' : '€';
|
|
301
|
+
const value = price.price * price.min_duration;
|
|
302
|
+
const duration = price.min_duration === 1 ? '1yr' : `${price.min_duration}yrs`;
|
|
303
|
+
return `${sign}${value.toFixed(2)} (${duration})`;
|
|
304
|
+
}
|
|
305
|
+
static formatDomain(domain) {
|
|
306
|
+
if (!domain.available || domain.premium) {
|
|
307
|
+
return this.getDimColor(`${domain.name} (Unavailable)`);
|
|
308
|
+
}
|
|
309
|
+
return `${this.getGreenColor(domain.name)} ${this.formatDomainPrice(domain.prices.create)} / ${this.formatDomainPrice(domain.prices.renew)}`;
|
|
310
|
+
}
|
|
311
|
+
static formatDomainClaim(domain, available) {
|
|
312
|
+
if (available) {
|
|
313
|
+
return `${this.getGreenColor(domain)} (Free)`;
|
|
314
|
+
}
|
|
315
|
+
return this.getDimColor(`${domain} (Unavailable)`);
|
|
316
|
+
}
|
|
317
|
+
static createMenuSeparator(text) {
|
|
318
|
+
return new prompts_1.default.Separator(text);
|
|
319
|
+
}
|
|
320
|
+
static createMenuItem(name, value, description, disabled) {
|
|
321
|
+
const item = {
|
|
322
|
+
name,
|
|
323
|
+
value,
|
|
324
|
+
};
|
|
325
|
+
if (description)
|
|
326
|
+
item.description = description;
|
|
327
|
+
if (disabled)
|
|
328
|
+
item.disabled = disabled;
|
|
329
|
+
return item;
|
|
330
|
+
}
|
|
291
331
|
static async inputMenu(message, items) {
|
|
292
332
|
if (this.isStdInTTY()) {
|
|
293
333
|
return await prompts_1.default.select({
|
|
294
334
|
message,
|
|
295
335
|
theme: this.getInquirerTheme(),
|
|
296
|
-
|
|
336
|
+
loop: false,
|
|
337
|
+
choices: items.map((item, index) => ({ value: index, name: item })),
|
|
297
338
|
});
|
|
298
339
|
}
|
|
299
340
|
else {
|
package/distTs/src/texts.js
CHANGED
|
@@ -11,14 +11,14 @@ exports.LOG_TUNNEL_HTTP_WRONG_USER_AGENTS = exports.LOG_TUNNEL_HTTP_CIRCUIT_BREA
|
|
|
11
11
|
exports.OPTION_SANDBOX_APP_TYPE = exports.OPTION_SANDBOX_APP_DIR = exports.OPTION_SANDBOX_RUN_COMMAND = exports.OPTION_SANDBOX_YAML = exports.OPTION_SANDBOX_TAGS = exports.OPTION_SANDBOX_INSTALL_COMMANDS = exports.OPTION_SANDBOX_RESOURCES = exports.OPTION_SANDBOX_OS = exports.OPTION_SANDBOX_NAME = exports.OPTION_SANDBOX_IDENTIFIER = exports.TXT_AUTOCOMPLETE_UNINSTALLED = exports.TXT_AUTOCOMPLETE_INSTALLED = exports.DESC_COMMAND_AUTOCOMPLETE_UNINSTALL = exports.DESC_COMMAND_AUTOCOMPLETE_INSTALL = exports.DESC_COMMAND_AUTOCOMPLETE = exports.DESC_COMMAND_SANDBOX_EXEC = exports.DESC_COMMAND_SANDBOX_STATUS = exports.DESC_COMMAND_SANDBOX_RESTART = exports.DESC_COMMAND_SANDBOX_STOP = exports.DESC_COMMAND_SANDBOX_START = exports.DESC_COMMAND_SANDBOX_DESTROY = exports.DESC_COMMAND_SANDBOX_GET = exports.DESC_COMMAND_SANDBOX_LIST = exports.DESC_COMMAND_SANDBOX_UPDATE = exports.DESC_COMMAND_SANDBOX_GET_YAML = exports.DESC_COMMAND_SANDBOX_CREATE = exports.DESC_COMMAND_SANDBOX = exports.DEBUG_WAIT_FOR_IDLE_TIMEOUT = exports.DEBUG_WAIT_FOR_IDLE = exports.DEBUG_RESOURCE_DISCOVERY_TIMEOUT = exports.DEBUG_AUTO_WIDTH = exports.DEBUG_AUTO_SCROLL = exports.DEBUG_RESOURCE_SCRAPPING_URL = exports.DEBUG_SNAPSHOT_PROCESSING = exports.DEBUG_SNAPSHOTS_PROCESSING = exports.DEBUG_EXEC_COMMAND = exports.DEBUG_EXEC_TEST_COMMAND = exports.LOG_INSTALLED_BROWSER = exports.LOG_SESSION_LINK = exports.LOG_SENDING_DATA = exports.LOG_SENDING_REQUEST = exports.LOG_PROCESSING_SNAPSHOTS = exports.LOG_RUNNING_EXEC_COMMAND = exports.LOG_TUNNEL_SSH_STREAM = exports.LOG_TUNNEL_TLS_AGENT_STREAM = exports.LOG_TUNNEL_TLS_REGION_STREAM = exports.LOG_TUNNEL_TLS_TARGET_STREAM = exports.LOG_TUNNEL_HTTP2_STREAM = exports.LOG_TUNNEL_HTTP1_STREAM = exports.LOG_TUNNEL_TCP_STREAM = void 0;
|
|
12
12
|
exports.DESC_COMMAND_SANDBOX_ENDPOINT_GET = exports.DESC_COMMAND_SANDBOX_ENDPOINT_LIST = exports.DESC_COMMAND_SANDBOX_ENDPOINT = exports.ERR_SANDBOX_SNAPSHOTS_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_NOT_FOUND = exports.ERR_SANDBOX_SNAPSHOT_FAILED = exports.TXT_SANDBOX_SNAPSHOT_WAITING = exports.TXT_SANDBOX_SNAPSHOT_DELETE_CONFIRM = exports.TXT_SANDBOX_SNAPSHOT_DELETED = exports.TXT_SANDBOX_SNAPSHOT_CREATED = exports.OPTION_SANDBOX_FROM_SNAPSHOT = exports.OPTION_SANDBOX_SNAPSHOT_NAME_ARG = exports.OPTION_SANDBOX_SNAPSHOT_NAME = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_DELETE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_GET = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_CREATE = exports.DESC_COMMAND_SANDBOX_SNAPSHOT_LIST = exports.DESC_COMMAND_SANDBOX_SNAPSHOT = exports.TXT_SANDBOX_COMMAND_KILLED = exports.OPTION_SANDBOX_COMMAND_KILL_CONFIRM = exports.OPTION_SANDBOX_COMMAND_ID = exports.DESC_COMMAND_SANDBOX_EXEC_KILL = exports.DESC_COMMAND_SANDBOX_EXEC_LOGS = exports.DESC_COMMAND_SANDBOX_EXEC_STATUS = exports.DESC_COMMAND_SANDBOX_EXEC_LIST = exports.TXT_SANDBOX_WAITING_START = exports.TXT_SANDBOX_WAITING_STOP = exports.TXT_SANDBOX_WAITING_SETUP = exports.TXT_SANDBOX_WAITING_RUNNING = exports.TXT_SANDBOX_STOPPED = exports.TXT_SANDBOX_STARTED = exports.TXT_SANDBOX_DESTROYED = exports.TXT_SANDBOX_DESTROY_CONFIRM = exports.TXT_SANDBOX_UPDATED = exports.TXT_SANDBOX_CREATED = exports.TXT_SANDBOX_CREATING = exports.OPTION_SANDBOX_WAIT = exports.OPTION_SANDBOX_WAIT_CONFIGURED = exports.OPTION_SANDBOX_WAIT_RUNNING = exports.ERR_SANDBOX_STOP_FAILED = exports.ERR_SANDBOX_NO_COMMANDS = exports.ERR_SANDBOX_RUNNING_FAILED = exports.ERR_SANDBOX_STOP_TIMEOUT = exports.ERR_SANDBOX_SNAPSHOT_TIMEOUT = exports.ERR_SANDBOX_RUNNING_TIMEOUT = exports.ERR_SANDBOX_SETUP_TIMEOUT = exports.ERR_SANDBOX_SETUP_FAILED = exports.ERR_SANDBOX_INVALID_RESOURCES = exports.ERR_SANDBOX_NOT_FOUND = exports.OPTION_SANDBOX_RUNTIME = void 0;
|
|
13
13
|
exports.DESC_COMMAND_API_WORKSPACE = exports.DESC_COMMAND_API_REQUEST_URL = exports.DESC_COMMAND_API_GET = exports.DESC_COMMAND_API_PATCH = exports.DESC_COMMAND_API_DELETE = exports.DESC_COMMAND_API_PUT = exports.DESC_COMMAND_API_POST = exports.DESC_COMMAND_API_LIST = exports.DESC_COMMAND_API = exports.ERR_WHOAMI_LOGOUT = exports.TXT_WHOAMI_NO_WORKSPACE = exports.DESC_COMMAND_WHOAMI = exports.TXT_SANDBOX_EXEC_FAILED = exports.TXT_SANDBOX_EXEC_INPROGRESS = exports.TXT_SANDBOX_EXEC_SUCCESS = exports.TXT_SANDBOX_EXEC_BACKGROUND = exports.TXT_SANDBOX_EXEC_ID = exports.ERR_SANDBOX_CP_INVALID_SOURCE = exports.ERR_SANDBOX_CP_INVALID_DEST = exports.ERR_SANDBOX_CP_REPLACE = exports.ERR_SANDBOX_CP_MKDIR = exports.ERR_SANDBOX_CP_PATH_EXISTS = exports.ERR_SANDBOX_CP_NOT_EMPTY_DIR = exports.ERR_SANDBOX_CP_READDIR = exports.ERR_SANDBOX_CP_DEST_NOT_FOLDER = exports.ERR_SANDBOX_CP_SOURCE_NOT_FOUND = exports.TXT_SANDBOX_CP_DONE = exports.TXT_SANDBOX_CP_PROGRESS = exports.TXT_SANDBOX_UNZIPPING_COUNT = exports.TXT_SANDBOX_UNZIP_DONE = exports.TXT_SANDBOX_UNZIP = exports.TXT_SANDBOX_CP_DOWNLOAD_DONE = exports.TXT_SANDBOX_CP_DOWNLOAD = exports.OPTION_SANDBOX_CP_DOWNLOAD_REPLACE = exports.OPTION_SANDBOX_CP_DOWNLOAD_MERGE = exports.OPTION_SANDBOX_CP_DEST = exports.OPTION_SANDBOX_CP_SOURCE = exports.DESC_COMMAND_SANDBOX_CP = exports.ERR_SANDBOX_ENDPOINTS_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_NOT_FOUND = exports.ERR_SANDBOX_ENDPOINT_EXISTS = exports.TXT_SANDBOX_ENDPOINT_DELETED = exports.TXT_SANDBOX_ENDPOINT_DELETE_CONFIRM = exports.TXT_SANDBOX_ENDPOINT_ADDED = exports.OPTION_SANDBOX_ENDPOINT_TYPE = exports.OPTION_SANDBOX_ENDPOINT_PORT = exports.OPTION_SANDBOX_ENDPOINT_NAME_ARG = exports.OPTION_SANDBOX_ENDPOINT_NAME = exports.DESC_COMMAND_SANDBOX_ENDPOINT_DELETE = exports.DESC_COMMAND_SANDBOX_ENDPOINT_ADD = void 0;
|
|
14
|
-
exports.
|
|
15
|
-
exports.
|
|
16
|
-
exports.EXAMPLE_PACKAGE_VERSION_DELETE = exports.EXAMPLE_PACKAGE_VERSION_GET = exports.EXAMPLE_PACKAGE_VERSION_LIST = exports.EXAMPLE_PACKAGE_CREATE = exports.EXAMPLE_PACKAGE_DELETE = exports.EXAMPLE_PACKAGE_DOWNLOAD = exports.EXAMPLE_PACKAGE_PUBLISH = exports.EXAMPLE_PIPELINE_RUN = exports.EXAMPLE_SANDBOX_ENDPOINT_LIST = exports.EXAMPLE_SANDBOX_ENDPOINT_GET = exports.EXAMPLE_SANDBOX_ENDPOINT_DELETE = exports.EXAMPLE_SANDBOX_ENDPOINT_CREATE = exports.EXAMPLE_SANDBOX_SNAPSHOT_LIST = exports.EXAMPLE_SANDBOX_SNAPSHOT_GET = exports.EXAMPLE_SANDBOX_SNAPSHOT_DELETE = exports.EXAMPLE_SANDBOX_SNAPSHOT_CREATE = exports.EXAMPLE_SANDBOX_EXEC_STATUS = exports.EXAMPLE_SANDBOX_EXEC_LOGS = exports.EXAMPLE_SANDBOX_EXEC_LIST = exports.EXAMPLE_SANDBOX_EXEC_KILL = exports.EXAMPLE_SANDBOX_EXEC_COMMAND = exports.EXAMPLE_TUNNEL_START = exports.EXAMPLE_TUNNEL_TCP = exports.EXAMPLE_TUNNEL_TLS = exports.EXAMPLE_AGENT_TUNNEL_START = exports.EXAMPLE_AGENT_TUNNEL_STATUS = exports.EXAMPLE_AGENT_TUNNEL_REMOVE = exports.EXAMPLE_AGENT_TUNNEL_LIST = exports.EXAMPLE_TUNNEL_HTTP = void 0;
|
|
14
|
+
exports.DESC_COMMAND_DOMAIN_GET = exports.DESC_COMMAND_DOMAIN_LIST = exports.DESC_COMMAND_DOMAIN_SEARCH = exports.DESC_COMMAND_DOMAIN_BUY = exports.DESC_COMMAND_DOMAIN = exports.ERR_API_MESSAGE_REPLACER = exports.ERR_LOGIN_INVALID_BASE_URL = exports.ERR_LOGIN_NO_WORKSPACE_FOUND = exports.ERR_LOGIN_NO_WORKSPACES = exports.ERR_LOGIN_HTTP_SUCCESS = exports.ERR_LOGIN_HTTP_FAILED = exports.TXT_LOGIN_OAUTH = exports.ERR_LOGIN_HTTP_SERVER_PORT_TAKEN = exports.TXT_LOGIN_SUCCESS = exports.TXT_LOGIN_SELECT_WORKSPACE = exports.TXT_LOGIN_ENTER_BASE_URL = exports.TXT_LOGIN_SELECT_REGION = exports.TXT_WORKSPACE_NONE = exports.TXT_WORKSPACE_SET_SUCCESS = exports.ARG_COMMAND_WORKSPACE = exports.DESC_COMMAND_WORKSPACE_GET = exports.DESC_COMMAND_WORKSPACE_SET = exports.DESC_COMMAND_WORKSPACE_LIST = exports.DESC_COMMAND_WORKSPACE = exports.TXT_LOGOUT_SUCCESS = exports.DESC_COMMAND_LOGOUT = exports.DESC_COMMAND_LOGIN = exports.ERR_API_MEDIA_TYPE_NOT_IMPLEMENTED = exports.ERR_API_PARAMETER_NOT_REPLACED = exports.TXT_API_ENDPOINT_REQUIRED_SCOPES = exports.ERR_API_ENDPOINT_NOT_FOUND = exports.ERR_API_WRONG_METHOD = exports.ERR_SCHEMA_FETCH_FAILED = exports.OPT_COMMAND_API_INFO_URL = exports.OPT_COMMAND_API_INFO_SCHEMA = exports.OPT_COMMAND_API_INFO_METHOD = exports.OPT_COMMAND_API_LIST_SEARCH = exports.OPT_COMMAND_API_LIST_METHOD = exports.ERR_API_REQUEST_BODY_VALUE = exports.ERR_API_REQUEST_QUERY_VALUE = exports.ERR_API_REQUEST_INVALID_JSON = exports.ERR_API_REQUEST_FILE_ERROR = exports.ERR_API_REQUEST_OUTPUT_EXISTS = exports.DESC_COMMAND_API_INFO = exports.DESC_COMMAND_API_FORM = exports.DESC_COMMAND_API_JSON = exports.DESC_COMMAND_API_DATA = exports.DESC_COMMAND_API_OUTPUT = exports.DESC_COMMAND_API_REQUEST_QUERY = exports.DESC_COMMAND_API_PROJECT = void 0;
|
|
15
|
+
exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO = exports.TXT_COMMAND_PROJECT_LINK_DIR_CONFIRM = exports.TXT_COMMAND_PROJECT_LINK_DIR_LINKED = exports.ERR_COMMAND_PROJECT_LINK_DIR_CREATE = exports.OPT_COMMAND_PROJECT_LINK_TRY_NOW = exports.OPT_COMMAND_PROJECT_LINK_SET_GIT_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_HAS_REMOTE = exports.OPT_COMMAND_PROJECT_LINK_DIRECTORY = exports.OPT_COMMAND_PROJECT_LINK_GIT = exports.OPT_COMMAND_PROJECT_LINK_RELINK = exports.DESC_COMMAND_PROJECT_LINK = exports.DESC_COMMAND_PROJECT_LIST = exports.DESC_COMMAND_PROJECT_GIT = exports.DESC_COMMAND_PROJECT_GIT_CREDENTIAL = exports.DESC_COMMAND_PROJECT = exports.TXT_PACKAGE_VERSION_DOWNLOAD = exports.TXT_PACKAGE_PUBLISH = exports.TXT_PACKAGE_CREATED = exports.TXT_PACKAGE_VERSION_DELETED = exports.TXT_PACKAGE_DELETED = exports.ERR_COMMAND_PACKAGE_TYPE = exports.OPT_COMMAND_PACKAGE_VERSION = exports.OPT_COMMAND_PACKAGE_IDENTIFIER = exports.OPT_COMMAND_PACKAGE_CREATE_IDENTIFIER = exports.OPT_COMMAND_PACKAGE_NAME = exports.OPT_COMMAND_PACKAGE_TYPE = exports.DESC_COMMAND_PACKAGE_CREATE = exports.DESC_COMMAND_PACKAGE_GET = exports.TXT_PACKAGE_DOCKER_LOGIN_FAILED = exports.TXT_PACKAGE_DOCKER_LOGIN_SUCCESS = exports.TXT_PACKAGE_VERSION_DELETE_CONFIRM = exports.TXT_PACKAGE_DELETE_CONFIRM = exports.DESC_COMMAND_PACKAGE_DELETE = exports.ERR_COMMAND_PACKAGE_NO_PROJECTS = exports.DESC_COMMAND_PACKAGE_VERSION_GET = exports.DESC_COMMAND_PACKAGE_VERSION_LIST = exports.DESC_COMMAND_PACKAGE_VERSION_DELETE = exports.DESC_COMMAND_PACKAGE_DOCKER_LOGIN = exports.DESC_COMMAND_PACKAGE_LIST = exports.DESC_COMMAND_PACKAGE_VERSION = exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = exports.ERR_COMMAND_DOMAIN_NOT_FOUND = exports.OPT_COMMAND_DOMAIN_PHRASE = exports.OPT_COMMAND_DOMAIN_BUY_OWNER = exports.OPT_COMMAND_DOMAIN_BUY_TLD = void 0;
|
|
16
|
+
exports.EXAMPLE_PACKAGE_VERSION_DELETE = exports.EXAMPLE_PACKAGE_VERSION_GET = exports.EXAMPLE_PACKAGE_VERSION_LIST = exports.EXAMPLE_PACKAGE_CREATE = exports.EXAMPLE_PACKAGE_DELETE = exports.EXAMPLE_PACKAGE_DOWNLOAD = exports.EXAMPLE_PACKAGE_PUBLISH = exports.EXAMPLE_PIPELINE_RUN = exports.EXAMPLE_SANDBOX_ENDPOINT_LIST = exports.EXAMPLE_SANDBOX_ENDPOINT_GET = exports.EXAMPLE_SANDBOX_ENDPOINT_DELETE = exports.EXAMPLE_SANDBOX_ENDPOINT_CREATE = exports.EXAMPLE_SANDBOX_SNAPSHOT_LIST = exports.EXAMPLE_SANDBOX_SNAPSHOT_GET = exports.EXAMPLE_SANDBOX_SNAPSHOT_DELETE = exports.EXAMPLE_SANDBOX_SNAPSHOT_CREATE = exports.EXAMPLE_SANDBOX_EXEC_STATUS = exports.EXAMPLE_SANDBOX_EXEC_LOGS = exports.EXAMPLE_SANDBOX_EXEC_LIST = exports.EXAMPLE_SANDBOX_EXEC_KILL = exports.EXAMPLE_SANDBOX_EXEC_COMMAND = exports.EXAMPLE_TUNNEL_START = exports.EXAMPLE_TUNNEL_TCP = exports.EXAMPLE_TUNNEL_TLS = exports.EXAMPLE_AGENT_TUNNEL_START = exports.EXAMPLE_AGENT_TUNNEL_STATUS = exports.EXAMPLE_AGENT_TUNNEL_REMOVE = exports.EXAMPLE_AGENT_TUNNEL_LIST = exports.EXAMPLE_TUNNEL_HTTP = exports.EXAMPLE_SANDBOX_CREATE = exports.EXAMPLE_SANDBOX_CP = exports.ERR_PROJECT_NO_PROJECTS = exports.TXT_LOGIN_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_CREATED = exports.TXT_COMMAND_PROJECT_LINK_NOT_FOUND = exports.TXT_COMMAND_PROJECT_LINK_NAME = exports.TXT_COMMAND_PROJECT_LINK_SELECT_PROJECT = exports.TXT_COMMAND_PROJECT_LINK_TO = exports.TXT_COMMAND_PROJECT_LINK_EXISTING_DESC = exports.TXT_COMMAND_PROJECT_LINK_EXISTING = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW_DESC = exports.TXT_COMMAND_PROJECT_LINK_CREATE_NEW = exports.ERR_COMMAND_PROJECT_LINK_DIR_NOT_DIR = exports.TXT_COMMAND_PROJECT_LINK_GIT_REPO_INITIALIZED = void 0;
|
|
17
17
|
const utils_1 = require("./utils");
|
|
18
18
|
exports.ERR_REST_API_GENERAL_ERROR = 'Something went wrong';
|
|
19
19
|
exports.ERR_REST_API_NOT_RESPONDING = 'Api endpoint not responding. Try again later...';
|
|
20
20
|
exports.ERR_REST_API_CONNECT_ERROR = 'Connection refused. Check selected endpoint';
|
|
21
|
-
exports.ERR_REST_API_WRONG_TOKEN = 'Valid token with proper scopes is required';
|
|
21
|
+
exports.ERR_REST_API_WRONG_TOKEN = 'Valid token with proper scopes is required or run bdy login';
|
|
22
22
|
exports.ERR_REST_API_RESOURCE_NOT_FOUND = 'Resource not found';
|
|
23
23
|
const ERR_REST_API_RATE_LIMIT = (rateLimitReset) => {
|
|
24
24
|
if (rateLimitReset) {
|
|
@@ -777,6 +777,22 @@ const ERR_API_MESSAGE_REPLACER = (message, path, baseUrl, rateLimitTs) => {
|
|
|
777
777
|
return message;
|
|
778
778
|
};
|
|
779
779
|
exports.ERR_API_MESSAGE_REPLACER = ERR_API_MESSAGE_REPLACER;
|
|
780
|
+
// domain commands
|
|
781
|
+
exports.DESC_COMMAND_DOMAIN = 'Manage domains';
|
|
782
|
+
exports.DESC_COMMAND_DOMAIN_BUY = 'Buy domain';
|
|
783
|
+
exports.DESC_COMMAND_DOMAIN_SEARCH = 'Search domain';
|
|
784
|
+
exports.DESC_COMMAND_DOMAIN_LIST = 'List domains';
|
|
785
|
+
exports.DESC_COMMAND_DOMAIN_GET = 'Get domain';
|
|
786
|
+
exports.OPT_COMMAND_DOMAIN_BUY_TLD = 'Filter tld. Can be passed multiple times or separated by comma. Example: --tld=de --tld=com,io';
|
|
787
|
+
exports.OPT_COMMAND_DOMAIN_BUY_OWNER = 'Buy domain on workspace owner behalf';
|
|
788
|
+
exports.OPT_COMMAND_DOMAIN_PHRASE = 'Phrase, full domain or part of it';
|
|
789
|
+
exports.ERR_COMMAND_DOMAIN_NOT_FOUND = 'Domain not found';
|
|
790
|
+
exports.TXT_COMMAND_DOMAIN_PROVIDE_PROMPT = 'Enter domain name or describe your needs:';
|
|
791
|
+
exports.TXT_COMMAND_DOMAIN_BUY_SELECT_DOMAIN = 'Select domain:';
|
|
792
|
+
exports.TXT_COMMAND_DOMAIN_PROMPT_REQUIRED = 'Domain or prompt is required';
|
|
793
|
+
exports.ERR_COMMAND_DOMAIN_NO_DOMAINS = 'No domains found';
|
|
794
|
+
exports.OPTION_COMMAND_DOMAIN_IDENTIFIER = 'Domain ID or name';
|
|
795
|
+
exports.ERR_COMMAND_DOMAIN_UNAVAILABLE = 'Domain unavailable';
|
|
780
796
|
// package commands
|
|
781
797
|
exports.DESC_COMMAND_PACKAGE_VERSION = 'Manage package versions';
|
|
782
798
|
exports.DESC_COMMAND_PACKAGE_LIST = 'List packages. Required scopes: PACKAGE_READ';
|
package/distTs/src/utils.js
CHANGED
|
@@ -47,6 +47,11 @@ exports.getDockerRegistryHostByApiBaseUrl = getDockerRegistryHostByApiBaseUrl;
|
|
|
47
47
|
exports.fetchOpenApiSchema = fetchOpenApiSchema;
|
|
48
48
|
exports.openApiPrepareUrl = openApiPrepareUrl;
|
|
49
49
|
exports.getOpenApiEndpointByApiBaseUrl = getOpenApiEndpointByApiBaseUrl;
|
|
50
|
+
exports.isValidDomain = isValidDomain;
|
|
51
|
+
exports.isValidSubdomain = isValidSubdomain;
|
|
52
|
+
exports.getSubdomain = getSubdomain;
|
|
53
|
+
exports.getDomainTld = getDomainTld;
|
|
54
|
+
exports.getPopularTlds = getPopularTlds;
|
|
50
55
|
exports.getAppHostByApiBaseUrl = getAppHostByApiBaseUrl;
|
|
51
56
|
const node_path_1 = __importDefault(require("node:path"));
|
|
52
57
|
const node_fs_1 = require("node:fs");
|
|
@@ -699,6 +704,76 @@ function getOpenApiEndpointByApiBaseUrl(baseUrl) {
|
|
|
699
704
|
return 'https://es.buddy.works/openapi/dev/restapi.json';
|
|
700
705
|
}
|
|
701
706
|
}
|
|
707
|
+
function isValidDomain(prompt) {
|
|
708
|
+
return /^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/i.test(prompt);
|
|
709
|
+
}
|
|
710
|
+
function isValidSubdomain(prompt) {
|
|
711
|
+
return /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/i.test(prompt);
|
|
712
|
+
}
|
|
713
|
+
function getSubdomain(domain) {
|
|
714
|
+
const idx = domain.indexOf('.');
|
|
715
|
+
if (idx < 0)
|
|
716
|
+
return '';
|
|
717
|
+
return domain.substring(0, idx);
|
|
718
|
+
}
|
|
719
|
+
function getDomainTld(domain) {
|
|
720
|
+
const idx = domain.lastIndexOf('.');
|
|
721
|
+
if (idx < 0)
|
|
722
|
+
return '';
|
|
723
|
+
return domain.substring(idx + 1);
|
|
724
|
+
}
|
|
725
|
+
function getPopularTlds() {
|
|
726
|
+
return [
|
|
727
|
+
'com',
|
|
728
|
+
'ai',
|
|
729
|
+
'io',
|
|
730
|
+
'net',
|
|
731
|
+
'cloud',
|
|
732
|
+
'dev',
|
|
733
|
+
'app',
|
|
734
|
+
'info',
|
|
735
|
+
'blog',
|
|
736
|
+
'run',
|
|
737
|
+
'me',
|
|
738
|
+
'at',
|
|
739
|
+
'nl',
|
|
740
|
+
'xyz',
|
|
741
|
+
'org',
|
|
742
|
+
'co',
|
|
743
|
+
'tech',
|
|
744
|
+
'studio',
|
|
745
|
+
'sh',
|
|
746
|
+
'space',
|
|
747
|
+
'fyi',
|
|
748
|
+
'link',
|
|
749
|
+
'es',
|
|
750
|
+
'art',
|
|
751
|
+
'club',
|
|
752
|
+
'inc',
|
|
753
|
+
'pro',
|
|
754
|
+
'store',
|
|
755
|
+
'shop',
|
|
756
|
+
'one',
|
|
757
|
+
'biz',
|
|
758
|
+
'vip',
|
|
759
|
+
'tube',
|
|
760
|
+
'online',
|
|
761
|
+
'design',
|
|
762
|
+
'realty',
|
|
763
|
+
'audio',
|
|
764
|
+
'lol',
|
|
765
|
+
'pics',
|
|
766
|
+
'love',
|
|
767
|
+
'baby',
|
|
768
|
+
'lat',
|
|
769
|
+
'so',
|
|
770
|
+
'homes',
|
|
771
|
+
'beauty',
|
|
772
|
+
'buzz',
|
|
773
|
+
'mom',
|
|
774
|
+
'my',
|
|
775
|
+
];
|
|
776
|
+
}
|
|
702
777
|
function getAppHostByApiBaseUrl(baseUrl) {
|
|
703
778
|
if (baseUrl.hostname.includes('api.buddy.works')) {
|
|
704
779
|
return 'app.buddy.works';
|