@botonic/cli 0.40.1 → 0.41.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -175
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.js +5 -0
- package/lib/{botonic-api-service.d.ts → src/botonic-api-service.d.ts} +3 -3
- package/lib/src/botonic-api-service.js +245 -0
- package/lib/src/botonic-api-service.js.map +1 -0
- package/lib/src/botonic-examples.d.ts +2 -0
- package/lib/src/botonic-examples.js +28 -0
- package/lib/src/botonic-examples.js.map +1 -0
- package/lib/{commands → src/commands}/deploy.d.ts +13 -22
- package/lib/src/commands/deploy.js +346 -0
- package/lib/src/commands/deploy.js.map +1 -0
- package/lib/src/commands/login.d.ts +11 -0
- package/lib/src/commands/login.js +33 -0
- package/lib/src/commands/login.js.map +1 -0
- package/lib/src/commands/logout.d.ts +11 -0
- package/lib/src/commands/logout.js +22 -0
- package/lib/src/commands/logout.js.map +1 -0
- package/lib/{commands → src/commands}/new.d.ts +8 -11
- package/lib/src/commands/new.js +134 -0
- package/lib/src/commands/new.js.map +1 -0
- package/lib/{commands → src/commands}/serve.d.ts +3 -3
- package/lib/src/commands/serve.js +22 -0
- package/lib/src/commands/serve.js.map +1 -0
- package/lib/src/constants.js +7 -0
- package/lib/src/constants.js.map +1 -0
- package/lib/src/index.d.ts +1 -0
- package/lib/src/index.js +2 -0
- package/lib/src/index.js.map +1 -0
- package/lib/{interfaces.d.ts → src/interfaces.d.ts} +9 -0
- package/lib/src/interfaces.js +2 -0
- package/lib/{interfaces.js.map → src/interfaces.js.map} +1 -1
- package/lib/src/util/bot-config.js +98 -0
- package/lib/src/util/bot-config.js.map +1 -0
- package/lib/{analytics → src/util}/credentials-handler.d.ts +1 -1
- package/lib/src/util/credentials-handler.js +73 -0
- package/lib/src/util/credentials-handler.js.map +1 -0
- package/lib/src/util/download-gzip.js +71 -0
- package/lib/src/util/download-gzip.js.map +1 -0
- package/lib/{util → src/util}/environment-info.d.ts +1 -1
- package/lib/src/util/environment-info.js +46 -0
- package/lib/src/util/environment-info.js.map +1 -0
- package/lib/{util → src/util}/file-system.d.ts +2 -2
- package/lib/src/util/file-system.js +45 -0
- package/lib/src/util/file-system.js.map +1 -0
- package/lib/src/util/system.js +32 -0
- package/lib/src/util/system.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/oclif.manifest.json +191 -1
- package/package.json +43 -36
- package/bin/run +0 -5
- package/lib/analytics/credentials-handler.js +0 -77
- package/lib/analytics/credentials-handler.js.map +0 -1
- package/lib/botonic-api-service.js +0 -274
- package/lib/botonic-api-service.js.map +0 -1
- package/lib/botonic-examples.d.ts +0 -2
- package/lib/botonic-examples.js +0 -76
- package/lib/botonic-examples.js.map +0 -1
- package/lib/commands/deploy.js +0 -422
- package/lib/commands/deploy.js.map +0 -1
- package/lib/commands/login.d.ts +0 -16
- package/lib/commands/login.js +0 -47
- package/lib/commands/login.js.map +0 -1
- package/lib/commands/logout.d.ts +0 -11
- package/lib/commands/logout.js +0 -29
- package/lib/commands/logout.js.map +0 -1
- package/lib/commands/new.js +0 -159
- package/lib/commands/new.js.map +0 -1
- package/lib/commands/serve.js +0 -28
- package/lib/commands/serve.js.map +0 -1
- package/lib/commands/test.d.ts +0 -8
- package/lib/commands/test.js +0 -43
- package/lib/commands/test.js.map +0 -1
- package/lib/constants.js +0 -10
- package/lib/constants.js.map +0 -1
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -6
- package/lib/index.js.map +0 -1
- package/lib/interfaces.js +0 -3
- package/lib/util/bot-config.js +0 -114
- package/lib/util/bot-config.js.map +0 -1
- package/lib/util/download-gzip.js +0 -87
- package/lib/util/download-gzip.js.map +0 -1
- package/lib/util/environment-info.js +0 -53
- package/lib/util/environment-info.js.map +0 -1
- package/lib/util/file-system.js +0 -59
- package/lib/util/file-system.js.map +0 -1
- package/lib/util/system.js +0 -43
- package/lib/util/system.js.map +0 -1
- package/scripts/postinstall.js +0 -13
- /package/lib/{constants.d.ts → src/constants.d.ts} +0 -0
- /package/lib/{util → src/util}/bot-config.d.ts +0 -0
- /package/lib/{util → src/util}/download-gzip.d.ts +0 -0
- /package/lib/{util → src/util}/system.d.ts +0 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { confirm, input, password, select } from '@inquirer/prompts';
|
|
2
|
+
import { Args, Command, Flags } from '@oclif/core';
|
|
3
|
+
import { rmSync, statSync } from 'fs';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import pc from 'picocolors';
|
|
7
|
+
import { ZipAFolder } from 'zip-a-folder';
|
|
8
|
+
import { BotonicAPIService } from '../botonic-api-service.js';
|
|
9
|
+
import { CLOUD_PROVIDERS } from '../constants.js';
|
|
10
|
+
import { BotConfig } from '../util/bot-config.js';
|
|
11
|
+
import { copyRecursively, createDir, pathExists, removeRecursively, } from '../util/file-system.js';
|
|
12
|
+
import { sleep } from '../util/system.js';
|
|
13
|
+
let npmCommand;
|
|
14
|
+
const BOTONIC_BUNDLE_FILE = 'botonic_bundle.zip';
|
|
15
|
+
const BOTONIC_TEMP_DIRNAME = 'tmp';
|
|
16
|
+
export default class Deploy extends Command {
|
|
17
|
+
static args = {
|
|
18
|
+
provider: Args.string({
|
|
19
|
+
description: 'Provider to deploy to',
|
|
20
|
+
options: Object.values(CLOUD_PROVIDERS),
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
static description = 'Deploy Botonic project to cloud provider';
|
|
24
|
+
static examples = [
|
|
25
|
+
'$ botonic deploy\nBuilding...\nCreating bundle...\nUploading...\n🚀 Bot deployed!',
|
|
26
|
+
];
|
|
27
|
+
static flags = {
|
|
28
|
+
command: Flags.string({
|
|
29
|
+
char: 'c',
|
|
30
|
+
description: 'Command to execute from the package "scripts" object',
|
|
31
|
+
}),
|
|
32
|
+
email: Flags.string({
|
|
33
|
+
char: 'e',
|
|
34
|
+
description: 'Email from Hubtype Organization',
|
|
35
|
+
}),
|
|
36
|
+
password: Flags.string({
|
|
37
|
+
char: 'p',
|
|
38
|
+
description: 'Password from Hubtype Organization',
|
|
39
|
+
}),
|
|
40
|
+
botName: Flags.string({
|
|
41
|
+
char: 'b',
|
|
42
|
+
description: 'Name of the bot from Hubtype where you want to deploy',
|
|
43
|
+
}),
|
|
44
|
+
};
|
|
45
|
+
botonicApiService = new BotonicAPIService();
|
|
46
|
+
botName = undefined;
|
|
47
|
+
async run() {
|
|
48
|
+
const { args, flags } = await this.parse(Deploy);
|
|
49
|
+
const provider = args.provider || CLOUD_PROVIDERS.HUBTYPE;
|
|
50
|
+
// TODO: -> In a next iteration it would be cool to get a prompt asking which provider we prefer (if it's the 1st deploy) or getting the provider from `.botonic.json` (after 1st deploy)
|
|
51
|
+
console.log(`Deploying to ${provider}...`);
|
|
52
|
+
console.log('This can take a while, do not cancel this process.');
|
|
53
|
+
if (provider === CLOUD_PROVIDERS.HUBTYPE)
|
|
54
|
+
await this.deployHubtype(flags);
|
|
55
|
+
}
|
|
56
|
+
async deployHubtype(flags) {
|
|
57
|
+
npmCommand = flags.command;
|
|
58
|
+
this.botName = flags.botName;
|
|
59
|
+
const email = flags.email;
|
|
60
|
+
const password = flags.password;
|
|
61
|
+
if (email && password)
|
|
62
|
+
await this.login(email, password);
|
|
63
|
+
else if (!this.botonicApiService.oauth)
|
|
64
|
+
await this.signupFlow();
|
|
65
|
+
else if (this.botName) {
|
|
66
|
+
await this.deployBotFromFlag(this.botName);
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
await this.deployBotFlow();
|
|
70
|
+
}
|
|
71
|
+
async deployBotFromFlag(botName) {
|
|
72
|
+
const bots = await this.getAvailableBots();
|
|
73
|
+
const bot = bots.filter(b => b.name === botName)[0];
|
|
74
|
+
if (bot === undefined && !botName) {
|
|
75
|
+
console.log(pc.red(`Bot ${botName} doesn't exist.`));
|
|
76
|
+
console.log('\nThese are the available options:');
|
|
77
|
+
bots.map(b => console.log(` > ${String(b.name)}`));
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
else if (botName) {
|
|
81
|
+
const botByBotName = bots.find(bot => bot.name === botName);
|
|
82
|
+
if (botByBotName) {
|
|
83
|
+
this.botonicApiService.setCurrentBot(bot);
|
|
84
|
+
return await this.deploy();
|
|
85
|
+
}
|
|
86
|
+
const userAnswer = await confirm({
|
|
87
|
+
message: 'Do you want to create a new Bot?',
|
|
88
|
+
});
|
|
89
|
+
if (userAnswer) {
|
|
90
|
+
return this.createNewBot(botName);
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.botonicApiService.setCurrentBot(bot);
|
|
96
|
+
return await this.deploy();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async signupFlow() {
|
|
100
|
+
const choices = [
|
|
101
|
+
'No, I need to create a new one (Signup)',
|
|
102
|
+
'Yes, I do. (Login)',
|
|
103
|
+
];
|
|
104
|
+
const signupConfirmation = await select({
|
|
105
|
+
message: 'You need to login before deploying your bot.\nDo you have a Hubtype account already?',
|
|
106
|
+
choices: choices,
|
|
107
|
+
});
|
|
108
|
+
if (signupConfirmation === choices[1])
|
|
109
|
+
return this.askLogin();
|
|
110
|
+
else
|
|
111
|
+
return this.askSignup();
|
|
112
|
+
}
|
|
113
|
+
async askEmailPassword() {
|
|
114
|
+
const userEmail = await input({ message: 'email:' });
|
|
115
|
+
const userPassword = await password({ message: 'password:', mask: true });
|
|
116
|
+
return { email: userEmail, password: userPassword };
|
|
117
|
+
}
|
|
118
|
+
async askLogin() {
|
|
119
|
+
const { email, password } = await this.askEmailPassword();
|
|
120
|
+
this.login(email, password);
|
|
121
|
+
}
|
|
122
|
+
async askSignup() {
|
|
123
|
+
const { email, password } = await this.askEmailPassword();
|
|
124
|
+
this.signup(email, password);
|
|
125
|
+
}
|
|
126
|
+
async deployBotFlow() {
|
|
127
|
+
if (this.botName) {
|
|
128
|
+
return this.deployBotFromFlag(this.botName);
|
|
129
|
+
}
|
|
130
|
+
if (!this.botonicApiService.bot ||
|
|
131
|
+
!Object.keys(this.botonicApiService.bot).length) {
|
|
132
|
+
return this.newBotFlow();
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const resp = await this.botonicApiService.getBots();
|
|
136
|
+
const bots = resp.data.results;
|
|
137
|
+
// Show the current bot in credentials at top of the list
|
|
138
|
+
const firstId = this.botonicApiService.bot.id;
|
|
139
|
+
bots.sort((x, y) => (x.id === firstId ? -1 : y.id === firstId ? 1 : 0));
|
|
140
|
+
return this.selectExistentBot(bots);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async login(email, password) {
|
|
144
|
+
try {
|
|
145
|
+
await this.botonicApiService.login(email, password);
|
|
146
|
+
await this.deployBotFlow();
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
const axiosError = err;
|
|
150
|
+
if (axiosError.response?.data?.error_description) {
|
|
151
|
+
console.log(pc.red(axiosError.response.data.error_description));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.log(pc.red('There was an error when trying to log in. Please, try again:'));
|
|
155
|
+
if (axiosError.response?.status && axiosError.response?.statusText) {
|
|
156
|
+
console.error(`Error ${axiosError.response.status}: ${axiosError.response.statusText}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
await this.askLogin();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async signup(email, password) {
|
|
163
|
+
const orgName = email.split('@')[0];
|
|
164
|
+
const campaign = { product: 'botonic' };
|
|
165
|
+
try {
|
|
166
|
+
await this.botonicApiService.signup(email, password, orgName, campaign);
|
|
167
|
+
await this.login(email, password);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (err.response?.data?.email) {
|
|
171
|
+
console.log(pc.red(err.response.data.email[0]));
|
|
172
|
+
}
|
|
173
|
+
if (err.response?.data?.password) {
|
|
174
|
+
console.log(pc.red(err.response.data.password[0]));
|
|
175
|
+
}
|
|
176
|
+
if (!err.response?.data?.email && !err.response?.data?.password) {
|
|
177
|
+
console.log(pc.red('There was an error trying to signup. Please, try again:'));
|
|
178
|
+
}
|
|
179
|
+
await this.askSignup();
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async getAvailableBots() {
|
|
183
|
+
const resp = await this.botonicApiService.getBots();
|
|
184
|
+
return resp.data.results;
|
|
185
|
+
}
|
|
186
|
+
async newBotFlow() {
|
|
187
|
+
const bots = await this.getAvailableBots();
|
|
188
|
+
if (!bots.length) {
|
|
189
|
+
return this.createNewBot();
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
const answer = await confirm({
|
|
193
|
+
message: 'Do you want to create a new Bot?',
|
|
194
|
+
});
|
|
195
|
+
if (answer) {
|
|
196
|
+
return this.createNewBot();
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
return this.selectExistentBot(bots);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
async createNewBotWithName(inpBotName) {
|
|
204
|
+
const MAX_ALLOWED_CHARS_FOR_BOT_NAME = 25;
|
|
205
|
+
if (inpBotName.length > MAX_ALLOWED_CHARS_FOR_BOT_NAME) {
|
|
206
|
+
throw new Error(`Maximum allowed chars for bot name is ${MAX_ALLOWED_CHARS_FOR_BOT_NAME} chars. Please, give a shorter name.`);
|
|
207
|
+
}
|
|
208
|
+
try {
|
|
209
|
+
await this.botonicApiService.createBot(inpBotName);
|
|
210
|
+
this.deploy();
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
console.log(pc.red(`There was an error saving the bot: ${String(err)}`));
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async createNewBot(botName) {
|
|
217
|
+
if (botName)
|
|
218
|
+
return this.createNewBotWithName(botName);
|
|
219
|
+
const newBotName = await input({ message: 'Bot name:' });
|
|
220
|
+
return await this.createNewBotWithName(newBotName);
|
|
221
|
+
}
|
|
222
|
+
async selectExistentBot(bots) {
|
|
223
|
+
const botNameSelected = await select({
|
|
224
|
+
message: 'Please, select a bot',
|
|
225
|
+
choices: bots.map(b => b.name),
|
|
226
|
+
});
|
|
227
|
+
const bot = bots.filter(b_1 => b_1.name === botNameSelected)[0];
|
|
228
|
+
this.botonicApiService.setCurrentBot(bot);
|
|
229
|
+
return await this.deploy();
|
|
230
|
+
}
|
|
231
|
+
displayProviders(providers) {
|
|
232
|
+
console.log('Your bot is published on:');
|
|
233
|
+
providers.forEach(p => {
|
|
234
|
+
if (p.provider === 'whatsapp')
|
|
235
|
+
console.log(`💬 [whatsapp] https://wa.me/${p.username}`);
|
|
236
|
+
if (p.provider === 'facebook')
|
|
237
|
+
console.log(`💬 [facebook] https://m.me/${p.username}`);
|
|
238
|
+
if (p.provider === 'telegram')
|
|
239
|
+
console.log(`💬 [telegram] https://t.me/${p.username}`);
|
|
240
|
+
if (p.provider === 'twitter')
|
|
241
|
+
console.log(`💬 [twitter] https://t.me/${p.username}`);
|
|
242
|
+
if (p.provider === 'generic')
|
|
243
|
+
console.log(`💬 Your app or website`);
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
async createBundle() {
|
|
247
|
+
const spinner = ora({
|
|
248
|
+
text: 'Creating bundle...',
|
|
249
|
+
spinner: 'bouncingBar',
|
|
250
|
+
}).start();
|
|
251
|
+
if (pathExists(BOTONIC_TEMP_DIRNAME))
|
|
252
|
+
removeRecursively(BOTONIC_TEMP_DIRNAME);
|
|
253
|
+
createDir(path.join(process.cwd(), BOTONIC_TEMP_DIRNAME));
|
|
254
|
+
copyRecursively('dist', path.join(BOTONIC_TEMP_DIRNAME, 'dist'));
|
|
255
|
+
const zipRes = await ZipAFolder.zip(BOTONIC_TEMP_DIRNAME, path.join(BOTONIC_BUNDLE_FILE));
|
|
256
|
+
if (zipRes instanceof Error) {
|
|
257
|
+
throw Error;
|
|
258
|
+
}
|
|
259
|
+
const zipStats = statSync(BOTONIC_BUNDLE_FILE);
|
|
260
|
+
spinner.succeed();
|
|
261
|
+
if (zipStats.size >= 10 * 10 ** 6) {
|
|
262
|
+
spinner.fail();
|
|
263
|
+
console.log(pc.red(`Deploy failed. Bundle size too big ${zipStats.size} (max 10Mb).`));
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async deployBundle(botConfigJson) {
|
|
268
|
+
const spinner = ora({
|
|
269
|
+
text: 'Deploying...',
|
|
270
|
+
spinner: 'bouncingBar',
|
|
271
|
+
}).start();
|
|
272
|
+
try {
|
|
273
|
+
const deploy = await this.botonicApiService.deployBot(path.join(process.cwd(), BOTONIC_BUNDLE_FILE), botConfigJson);
|
|
274
|
+
if (deploy.response?.status === 403 || !deploy.data.deploy_id) {
|
|
275
|
+
throw deploy.response.data.status;
|
|
276
|
+
}
|
|
277
|
+
// eslint-disable-next-line no-constant-condition
|
|
278
|
+
while (true) {
|
|
279
|
+
await sleep(500);
|
|
280
|
+
const deployStatus = await this.botonicApiService.deployStatus(deploy.data.deploy_id);
|
|
281
|
+
if (deployStatus.data.is_completed) {
|
|
282
|
+
if (deployStatus.data.status == 'deploy_status_completed_ok') {
|
|
283
|
+
spinner.succeed();
|
|
284
|
+
console.log(pc.green('\n🚀 Bot deployed!\n'));
|
|
285
|
+
return { hasDeployErrors: false };
|
|
286
|
+
}
|
|
287
|
+
else
|
|
288
|
+
throw deployStatus.data.error;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
spinner.fail();
|
|
294
|
+
const error = String(err);
|
|
295
|
+
console.log(pc.red('There was a problem in the deploy:'));
|
|
296
|
+
console.log(pc.red(error));
|
|
297
|
+
return { hasDeployErrors: true };
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
async displayDeployResults(hasDeployErrors) {
|
|
301
|
+
try {
|
|
302
|
+
const providersRes = await this.botonicApiService.getProviders();
|
|
303
|
+
const providers = providersRes.data.results;
|
|
304
|
+
if (hasDeployErrors)
|
|
305
|
+
return false;
|
|
306
|
+
if (!providers.length) {
|
|
307
|
+
const botId = this.botonicApiService.botInfo().id;
|
|
308
|
+
const accessToken = this.botonicApiService.getOauth().access_token;
|
|
309
|
+
const links = 'Now, you can integrate a channel in:' +
|
|
310
|
+
`\nhttps://app.hubtype.com/bots/${botId}/integrations?access_token=${accessToken}`;
|
|
311
|
+
console.log(links);
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
this.displayProviders(providers);
|
|
315
|
+
}
|
|
316
|
+
return true;
|
|
317
|
+
}
|
|
318
|
+
catch (e) {
|
|
319
|
+
console.log(pc.red(`There was an error getting the providers: ${String(e)}`));
|
|
320
|
+
return false;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/* istanbul ignore next */
|
|
324
|
+
async deploy() {
|
|
325
|
+
try {
|
|
326
|
+
const buildOut = await this.botonicApiService.build(npmCommand);
|
|
327
|
+
if (!buildOut) {
|
|
328
|
+
console.log(pc.red('There was a problem building the bot'));
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const botConfigJson = await BotConfig.get(process.cwd());
|
|
332
|
+
await this.createBundle();
|
|
333
|
+
const { hasDeployErrors } = await this.deployBundle(botConfigJson);
|
|
334
|
+
await this.displayDeployResults(hasDeployErrors);
|
|
335
|
+
}
|
|
336
|
+
catch (e) {
|
|
337
|
+
console.log(pc.red('Deploy Error'), e);
|
|
338
|
+
}
|
|
339
|
+
finally {
|
|
340
|
+
rmSync(BOTONIC_BUNDLE_FILE);
|
|
341
|
+
removeRecursively(BOTONIC_TEMP_DIRNAME);
|
|
342
|
+
this.botonicApiService.beforeExit();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Login extends Command {
|
|
3
|
+
static args: {};
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: any[];
|
|
6
|
+
static flags: {
|
|
7
|
+
path: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
private botonicApiService;
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { input, password } from '@inquirer/prompts';
|
|
2
|
+
import { Command, Flags } from '@oclif/core';
|
|
3
|
+
import pc from 'picocolors';
|
|
4
|
+
import { BotonicAPIService } from '../botonic-api-service.js';
|
|
5
|
+
export default class Login extends Command {
|
|
6
|
+
static args = {};
|
|
7
|
+
static description = 'Log in to Botonic';
|
|
8
|
+
static examples = [];
|
|
9
|
+
//TODO: Review path flag, currently not used
|
|
10
|
+
static flags = {
|
|
11
|
+
path: Flags.string({
|
|
12
|
+
char: 'p',
|
|
13
|
+
description: 'Path to botonic project. Defaults to current dir.',
|
|
14
|
+
}),
|
|
15
|
+
};
|
|
16
|
+
botonicApiService = new BotonicAPIService();
|
|
17
|
+
async run() {
|
|
18
|
+
const { flags } = await this.parse(Login);
|
|
19
|
+
const userEmail = await input({ required: true, message: 'email:' });
|
|
20
|
+
const userPassword = await password({ mask: true, message: 'password:' });
|
|
21
|
+
try {
|
|
22
|
+
await this.botonicApiService.login(userEmail, userPassword);
|
|
23
|
+
console.log(pc.green('Login successful!'));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(pc.red('Failed to login'));
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
this.botonicApiService.beforeExit();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,MAAM,CAAC,OAAO,OAAO,KAAM,SAAQ,OAAO;IACxC,MAAM,CAAU,IAAI,GAAG,EAAE,CAAA;IACzB,MAAM,CAAU,WAAW,GAAG,mBAAmB,CAAA;IACjD,MAAM,CAAU,QAAQ,GAAG,EAAE,CAAA;IAC7B,4CAA4C;IAC5C,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,mDAAmD;SACjE,CAAC;KACH,CAAA;IAEO,iBAAiB,GAAsB,IAAI,iBAAiB,EAAE,CAAA;IAE/D,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAEzC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAA;QAEzE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;YAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAC1C,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,CAAA;QACrC,CAAC;IACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Logout extends Command {
|
|
3
|
+
static args: {};
|
|
4
|
+
static description: string;
|
|
5
|
+
static examples: any[];
|
|
6
|
+
static flags: {
|
|
7
|
+
path: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
private botonicApiService;
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { BotonicAPIService } from '../botonic-api-service.js';
|
|
3
|
+
export default class Logout extends Command {
|
|
4
|
+
static args = {};
|
|
5
|
+
static description = 'Log out of Botonic';
|
|
6
|
+
static examples = [];
|
|
7
|
+
//TODO: Review path flag, currently not used
|
|
8
|
+
static flags = {
|
|
9
|
+
path: Flags.string({
|
|
10
|
+
char: 'p',
|
|
11
|
+
description: 'Path to botonic project. Defaults to current dir.',
|
|
12
|
+
}),
|
|
13
|
+
};
|
|
14
|
+
botonicApiService = new BotonicAPIService();
|
|
15
|
+
async run() {
|
|
16
|
+
const { flags } = await this.parse(Logout);
|
|
17
|
+
this.botonicApiService.logout();
|
|
18
|
+
console.log('You have been log out!');
|
|
19
|
+
return Promise.resolve();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,MAAM,CAAU,IAAI,GAAG,EAAE,CAAA;IACzB,MAAM,CAAU,WAAW,GAAG,oBAAoB,CAAA;IAClD,MAAM,CAAU,QAAQ,GAAG,EAAE,CAAA;IAE7B,4CAA4C;IAC5C,MAAM,CAAU,KAAK,GAAG;QACtB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,mDAAmD;SACjE,CAAC;KACH,CAAA;IAEO,iBAAiB,GAAsB,IAAI,iBAAiB,EAAE,CAAA;IAE/D,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAE1C,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAA;QAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC"}
|
|
@@ -1,19 +1,16 @@
|
|
|
1
|
-
import { Command } from '@oclif/
|
|
2
|
-
import { BotonicProject } from '../interfaces';
|
|
3
|
-
export default class
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
import { BotonicProject } from '../interfaces.js';
|
|
3
|
+
export default class New extends Command {
|
|
4
|
+
static args: {
|
|
5
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
projectName: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
4
8
|
static description: string;
|
|
5
9
|
static examples: string[];
|
|
6
|
-
static
|
|
7
|
-
name: string;
|
|
8
|
-
description: string;
|
|
9
|
-
required: boolean;
|
|
10
|
-
}[];
|
|
10
|
+
static flags: {};
|
|
11
11
|
private examples;
|
|
12
12
|
private botonicApiService;
|
|
13
13
|
run(): Promise<void>;
|
|
14
|
-
selectBotName(): Promise<{
|
|
15
|
-
botName: string;
|
|
16
|
-
}>;
|
|
17
14
|
resolveSelectedProject(projectName: string | undefined): Promise<BotonicProject | undefined>;
|
|
18
15
|
downloadSelectedProjectIntoPath(selectedProject: BotonicProject, userProjectDirName: string): Promise<void>;
|
|
19
16
|
installDependencies(command?: string): Promise<void>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { select } from '@inquirer/prompts';
|
|
2
|
+
import { Args, Command } from '@oclif/core';
|
|
3
|
+
import { exec as childProcessExec } from 'child_process';
|
|
4
|
+
import fsExtra from 'fs-extra';
|
|
5
|
+
import ora from 'ora';
|
|
6
|
+
import { platform } from 'os';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import pc from 'picocolors';
|
|
9
|
+
import { promisify } from 'util';
|
|
10
|
+
import { BotonicAPIService } from '../botonic-api-service.js';
|
|
11
|
+
import { EXAMPLES } from '../botonic-examples.js';
|
|
12
|
+
import { downloadSelectedProject, editPackageJsonName, extractTarGz, renameFolder, } from '../util/download-gzip.js';
|
|
13
|
+
import { pathExists, removeRecursively } from '../util/file-system.js';
|
|
14
|
+
const exec = promisify(childProcessExec);
|
|
15
|
+
export default class New extends Command {
|
|
16
|
+
static args = {
|
|
17
|
+
name: Args.string({
|
|
18
|
+
description: 'name of the bot folder',
|
|
19
|
+
required: true,
|
|
20
|
+
}),
|
|
21
|
+
projectName: Args.string({
|
|
22
|
+
description: 'OPTIONAL name of the bot project',
|
|
23
|
+
required: false,
|
|
24
|
+
}),
|
|
25
|
+
};
|
|
26
|
+
static description = 'Create a new Botonic project';
|
|
27
|
+
static examples = [
|
|
28
|
+
'$ botonic new test_bot\nCreating...\n✨ test_bot was successfully created!',
|
|
29
|
+
];
|
|
30
|
+
static flags = {};
|
|
31
|
+
examples = EXAMPLES;
|
|
32
|
+
botonicApiService = new BotonicAPIService();
|
|
33
|
+
async run() {
|
|
34
|
+
try {
|
|
35
|
+
const { args } = await this.parse(New);
|
|
36
|
+
const userProjectDirName = args.name;
|
|
37
|
+
const selectedProjectName = args.projectName;
|
|
38
|
+
const selectedProject = await this.resolveSelectedProject(selectedProjectName);
|
|
39
|
+
if (!selectedProject) {
|
|
40
|
+
console.log(pc.red(`Example ${String(selectedProjectName)} does not exist, please choose one of the following:\n` +
|
|
41
|
+
`${this.examples.map(p => p.name).join(', ')}`));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
await this.downloadSelectedProjectIntoPath(selectedProject, userProjectDirName);
|
|
45
|
+
process.chdir(userProjectDirName);
|
|
46
|
+
const devPlatform = platform();
|
|
47
|
+
if (devPlatform === 'win32') {
|
|
48
|
+
await this.installDependencies();
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// TODO: review this when node-sass is needed again
|
|
52
|
+
// Solve issue with node-sass and higher versions of Node.
|
|
53
|
+
// Ref: https://github.com/nodejs/node/issues/38367#issuecomment-1025343439)
|
|
54
|
+
await this.installDependencies('CXXFLAGS="--std=c++14" npm install');
|
|
55
|
+
}
|
|
56
|
+
this.botonicApiService.beforeExit();
|
|
57
|
+
fsExtra.moveSync(path.join('..', '.botonic.json'), path.join(process.cwd(), '.botonic.json'));
|
|
58
|
+
console.log(this.getProcessFeedback(selectedProject, userProjectDirName));
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
throw new Error(`botonic new error: ${String(e)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async resolveSelectedProject(projectName) {
|
|
65
|
+
if (!projectName) {
|
|
66
|
+
const botDescription = await select({
|
|
67
|
+
message: 'Select a bot example',
|
|
68
|
+
choices: this.examples.map(p => p.description),
|
|
69
|
+
});
|
|
70
|
+
return this.examples.find(p => p.description === botDescription);
|
|
71
|
+
}
|
|
72
|
+
return this.examples.find(p => p.name === projectName);
|
|
73
|
+
}
|
|
74
|
+
async downloadSelectedProjectIntoPath(selectedProject, userProjectDirName) {
|
|
75
|
+
if (pathExists(userProjectDirName))
|
|
76
|
+
removeRecursively(userProjectDirName);
|
|
77
|
+
const spinnerDownload = ora({
|
|
78
|
+
text: 'Downloading files...',
|
|
79
|
+
spinner: 'bouncingBar',
|
|
80
|
+
}).start();
|
|
81
|
+
try {
|
|
82
|
+
const pathToCreateExample = path.join('.');
|
|
83
|
+
await downloadSelectedProject({
|
|
84
|
+
exampleName: selectedProject.name,
|
|
85
|
+
exampleVersion: selectedProject.version,
|
|
86
|
+
});
|
|
87
|
+
spinnerDownload.succeed();
|
|
88
|
+
const spinnerExtract = ora({
|
|
89
|
+
text: 'Extracting files...',
|
|
90
|
+
spinner: 'bouncingBar',
|
|
91
|
+
}).start();
|
|
92
|
+
await extractTarGz({
|
|
93
|
+
projectPath: pathToCreateExample,
|
|
94
|
+
exampleName: selectedProject.name,
|
|
95
|
+
exampleVersion: selectedProject.version,
|
|
96
|
+
});
|
|
97
|
+
spinnerExtract.succeed();
|
|
98
|
+
await renameFolder(userProjectDirName);
|
|
99
|
+
await editPackageJsonName(pathToCreateExample, userProjectDirName);
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
spinnerDownload.fail();
|
|
103
|
+
const error = `Downloading Project: ${selectedProject.name}: ${String(e)}`;
|
|
104
|
+
throw new Error(error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async installDependencies(command = 'npm install') {
|
|
108
|
+
const spinner = ora({
|
|
109
|
+
text: 'Installing dependencies...',
|
|
110
|
+
spinner: 'bouncingBar',
|
|
111
|
+
}).start();
|
|
112
|
+
try {
|
|
113
|
+
await exec(command);
|
|
114
|
+
spinner.succeed();
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
spinner.fail();
|
|
118
|
+
const error = `Installing dependencies: ${String(e)}`;
|
|
119
|
+
throw new Error(error);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
getProcessFeedback(selectedProject, path) {
|
|
123
|
+
let feedback = `\n✨ Bot ${pc.bold(path)} was successfully created!\n\n`;
|
|
124
|
+
feedback += 'Next steps:\n';
|
|
125
|
+
feedback += pc.bold(`cd ${path}\n`);
|
|
126
|
+
feedback += selectedProject.name === 'nlu' ? pc.bold(`botonic train\n`) : '';
|
|
127
|
+
const serveCmd = `${pc.bold('botonic serve')} (test your bot locally from the browser)\n`;
|
|
128
|
+
feedback += serveCmd;
|
|
129
|
+
const deployCmd = `${pc.bold('botonic deploy')} (publish your bot to the world!)`;
|
|
130
|
+
feedback += deployCmd;
|
|
131
|
+
return feedback;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../../src/commands/new.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Command } from '@oclif/
|
|
2
|
-
export default class
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Serve extends Command {
|
|
3
|
+
static args: {};
|
|
3
4
|
static description: string;
|
|
4
5
|
static examples: string[];
|
|
5
6
|
static flags: {};
|
|
6
|
-
static args: never[];
|
|
7
7
|
run(): Promise<void>;
|
|
8
8
|
}
|