@botpress/cli 0.0.5 → 0.0.8

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.
@@ -39,13 +39,17 @@ var import_client = require("@botpress/client");
39
39
  var import_axios = __toESM(require("axios"));
40
40
  var import_verror = require("verror");
41
41
  var consts = __toESM(require("../consts"));
42
+ const isKnownApiError = (e) => (0, import_client.isApiError)(e) && !(e instanceof import_client.UnknownError);
42
43
  class BotpressCLIError extends import_verror.VError {
43
44
  static wrap(thrown, message) {
44
45
  const err = BotpressCLIError.map(thrown);
45
46
  return new BotpressCLIError(err, message ?? "");
46
47
  }
47
48
  static map(thrown) {
48
- if ((0, import_client.isApiError)(thrown)) {
49
+ if (thrown instanceof import_client.UnknownError) {
50
+ return new HTTPError(500, "An unknown error has occurred.");
51
+ }
52
+ if (isKnownApiError(thrown)) {
49
53
  return HTTPError.fromApi(thrown);
50
54
  }
51
55
  if (import_axios.default.isAxiosError(thrown)) {
package/dist/app/index.js CHANGED
@@ -33,21 +33,23 @@ var import_chalk = __toESM(require("chalk"));
33
33
  var import_fs = __toESM(require("fs"));
34
34
  var consts = __toESM(require("../consts"));
35
35
  var import_logger = require("../logger");
36
+ var import_update_notif = require("../update-notif");
36
37
  var import_cache = require("./cache");
37
38
  var import_file_paths = require("./file-paths");
38
39
  var import_project = require("./project");
39
40
  var import_user = require("./user");
40
41
  var errors = __toESM(require("./errors"));
41
- const logBootInfo = (logger, props) => {
42
+ const logBootInfo = async (logger, props) => {
42
43
  const versionText = import_chalk.default.bold(`v${props.version}`);
43
44
  logger.log(`Botpress CLI ${versionText}`, { prefix: "\u{1F916}" });
45
+ await (0, import_update_notif.notifyUpdate)(props, logger);
44
46
  if (props.botpressHome !== consts.defaultBotpressHome) {
45
47
  logger.log(`Using custom botpress home: ${props.botpressHome}`, { prefix: "\u{1F3E0}" });
46
48
  }
47
49
  };
48
50
  const forProject = async (props) => {
49
51
  const logger = new import_logger.Logger(props);
50
- logBootInfo(logger, props);
52
+ await logBootInfo(logger, props);
51
53
  const projectPaths = new import_file_paths.ProjectPaths(props);
52
54
  const projectCachePath = projectPaths.abs.projectCacheFile;
53
55
  const projectCache = await import_cache.FSConfigCache.loadFrom(projectCachePath);
@@ -59,7 +61,7 @@ const forProject = async (props) => {
59
61
  };
60
62
  const forUser = async (props) => {
61
63
  const logger = new import_logger.Logger(props);
62
- logBootInfo(logger, props);
64
+ await logBootInfo(logger, props);
63
65
  const userPaths = new import_file_paths.UserPaths(props);
64
66
  const userCacheFile = userPaths.abs.userCacheFile;
65
67
  const userCache = await import_cache.FSConfigCache.loadFrom(userCacheFile);
@@ -37,6 +37,7 @@ var consts = __toESM(require("../consts"));
37
37
  var esbuildutils = __toESM(require("../esbuild-utils"));
38
38
  var pathutils = __toESM(require("../path-utils"));
39
39
  var requireutils = __toESM(require("../require-utils"));
40
+ var import_watcher = require("../watcher");
40
41
  var import_worker = require("../worker");
41
42
  var import_base = require("./base");
42
43
  var errors = __toESM(require("./errors"));
@@ -162,7 +163,7 @@ class ProjectCommands extends import_base.BaseCommands {
162
163
  const importPath = pathutils.toUnix(outfile);
163
164
  const requireFrom = pathutils.rmExtension(importPath);
164
165
  const code = `require('${requireFrom}').default.start(${argv.port})`;
165
- await (0, import_worker.spawnChildProcess)(
166
+ const worker = await import_worker.Worker.spawn(
166
167
  {
167
168
  type: "code",
168
169
  code,
@@ -172,7 +173,32 @@ class ProjectCommands extends import_base.BaseCommands {
172
173
  }
173
174
  },
174
175
  this._logger
175
- );
176
+ ).catch((thrown) => {
177
+ throw errors.BotpressCLIError.wrap(thrown, "Could not start dev worker");
178
+ });
179
+ try {
180
+ const watcher = await import_watcher.FileWatcher.watch(
181
+ argv.workDir,
182
+ async (events) => {
183
+ const typescriptEvents = events.filter((e) => import_path.default.extname(e.path) === ".ts");
184
+ if (typescriptEvents.length === 0) {
185
+ return;
186
+ }
187
+ this._logger.log("Changes detected, reloading...");
188
+ await this.buildProject(argv);
189
+ await worker.reload();
190
+ },
191
+ { ignore: [this._paths.abs.outDir] }
192
+ );
193
+ await Promise.race([worker.wait(), watcher.wait()]);
194
+ await watcher.close();
195
+ } catch (thrown) {
196
+ throw errors.BotpressCLIError.wrap(thrown, "An error occurred while running the dev worker");
197
+ } finally {
198
+ if (worker.running) {
199
+ await worker.kill();
200
+ }
201
+ }
176
202
  }
177
203
  async _deployDevIntegration(api, externalUrl, integrationDef) {
178
204
  const devId = await this._projectCache.get("devId");
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var event_emitter_exports = {};
20
+ __export(event_emitter_exports, {
21
+ EventEmitter: () => EventEmitter
22
+ });
23
+ module.exports = __toCommonJS(event_emitter_exports);
24
+ class EventEmitter {
25
+ listeners = {};
26
+ emit(type, event) {
27
+ const listeners = this.listeners[type];
28
+ if (!listeners) {
29
+ return;
30
+ }
31
+ for (const listener of listeners) {
32
+ listener(event);
33
+ }
34
+ }
35
+ once(type, listener) {
36
+ const wrapped = (event) => {
37
+ this.off(type, wrapped);
38
+ listener(event);
39
+ };
40
+ this.on(type, wrapped);
41
+ }
42
+ on(type, listener) {
43
+ if (!this.listeners[type]) {
44
+ this.listeners[type] = [];
45
+ }
46
+ this.listeners[type].push(listener);
47
+ }
48
+ off(type, listener) {
49
+ const listeners = this.listeners[type];
50
+ if (!listeners) {
51
+ return;
52
+ }
53
+ const index = listeners.indexOf(listener);
54
+ if (index !== -1) {
55
+ listeners.splice(index, 1);
56
+ }
57
+ }
58
+ }
59
+ // Annotate the CommonJS export names for ESM import in node:
60
+ 0 && (module.exports = {
61
+ EventEmitter
62
+ });
package/dist/index.js CHANGED
@@ -22,7 +22,8 @@ var import_process = require("process");
22
22
  var app = __toESM(require("./app"));
23
23
  var config = __toESM(require("./config"));
24
24
  var import_logger = require("./logger");
25
- const { version } = require("../package.json");
25
+ const { name, version } = require("../package.json");
26
+ const pkg = { name, version };
26
27
  const errorLogger = new import_logger.Logger();
27
28
  const logError = (thrown) => {
28
29
  const error = app.errors.BotpressCLIError.map(thrown);
@@ -51,7 +52,7 @@ import_yargs_extra.default.command(
51
52
  async (argv) => {
52
53
  try {
53
54
  const parsed = parseArguments(config.loginSchema, argv);
54
- const commands = await app.forUser({ ...parsed, version });
55
+ const commands = await app.forUser({ ...parsed, ...pkg });
55
56
  await commands.login(parsed);
56
57
  commands.teardown();
57
58
  } catch (e) {
@@ -65,7 +66,7 @@ import_yargs_extra.default.command(
65
66
  async (argv) => {
66
67
  try {
67
68
  const parsed = parseArguments(config.logoutSchema, argv);
68
- const commands = await app.forUser({ ...parsed, version });
69
+ const commands = await app.forUser({ ...parsed, ...pkg });
69
70
  await commands.logout();
70
71
  commands.teardown();
71
72
  } catch (e) {
@@ -80,7 +81,7 @@ import_yargs_extra.default.command(
80
81
  async (argv) => {
81
82
  try {
82
83
  const parsed = parseArguments(config.createBotSchema, argv);
83
- const commands = await app.forUser({ ...parsed, version });
84
+ const commands = await app.forUser({ ...parsed, ...pkg });
84
85
  await commands.createBot(parsed);
85
86
  commands.teardown();
86
87
  } catch (e) {
@@ -94,7 +95,7 @@ import_yargs_extra.default.command(
94
95
  async (argv) => {
95
96
  try {
96
97
  const parsed = parseArguments(config.listBotsSchema, argv);
97
- const commands = await app.forUser({ ...parsed, version });
98
+ const commands = await app.forUser({ ...parsed, ...pkg });
98
99
  await commands.listBots(parsed);
99
100
  commands.teardown();
100
101
  } catch (e) {
@@ -108,7 +109,7 @@ import_yargs_extra.default.command(
108
109
  async (argv) => {
109
110
  try {
110
111
  const parsed = parseArguments(config.readBotSchema, argv);
111
- const commands = await app.forUser({ ...parsed, version });
112
+ const commands = await app.forUser({ ...parsed, ...pkg });
112
113
  await commands.getBot(argv.botRef, parsed);
113
114
  commands.teardown();
114
115
  } catch (e) {
@@ -122,7 +123,7 @@ import_yargs_extra.default.command(
122
123
  async (argv) => {
123
124
  try {
124
125
  const parsed = parseArguments(config.deleteBotSchema, argv);
125
- const commands = await app.forUser({ ...parsed, version });
126
+ const commands = await app.forUser({ ...parsed, ...pkg });
126
127
  await commands.deleteBot(argv.botRef, parsed);
127
128
  commands.teardown();
128
129
  } catch (e) {
@@ -138,7 +139,7 @@ import_yargs_extra.default.command(
138
139
  async (argv) => {
139
140
  try {
140
141
  const parsed = parseArguments(config.listIntegrationsSchema, argv);
141
- const commands = await app.forUser({ ...parsed, version });
142
+ const commands = await app.forUser({ ...parsed, ...pkg });
142
143
  await commands.listIntegrations(parsed);
143
144
  commands.teardown();
144
145
  } catch (e) {
@@ -152,7 +153,7 @@ import_yargs_extra.default.command(
152
153
  async (argv) => {
153
154
  try {
154
155
  const parsed = parseArguments(config.readIntegrationSchema, argv);
155
- const commands = await app.forUser({ ...parsed, version });
156
+ const commands = await app.forUser({ ...parsed, ...pkg });
156
157
  await commands.getIntegration(argv.integrationRef, parsed);
157
158
  commands.teardown();
158
159
  } catch (e) {
@@ -166,7 +167,7 @@ import_yargs_extra.default.command(
166
167
  async (argv) => {
167
168
  try {
168
169
  const parsed = parseArguments(config.readIntegrationSchema, argv);
169
- const commands = await app.forUser({ ...parsed, version });
170
+ const commands = await app.forUser({ ...parsed, ...pkg });
170
171
  await commands.deleteIntegration(argv.integrationRef, parsed);
171
172
  commands.teardown();
172
173
  } catch (e) {
@@ -181,7 +182,7 @@ import_yargs_extra.default.command(
181
182
  async (argv) => {
182
183
  try {
183
184
  const parsed = parseArguments(config.bundleSchema, argv);
184
- const commands = await app.forProject({ ...parsed, version });
185
+ const commands = await app.forProject({ ...parsed, ...pkg });
185
186
  await commands.bundleProject(parsed);
186
187
  commands.teardown();
187
188
  } catch (e) {
@@ -195,7 +196,7 @@ import_yargs_extra.default.command(
195
196
  async (argv) => {
196
197
  try {
197
198
  const parsed = parseArguments(config.generateSchema, argv);
198
- const commands = await app.forProject({ ...parsed, version });
199
+ const commands = await app.forProject({ ...parsed, ...pkg });
199
200
  await commands.generateTypings(parsed);
200
201
  commands.teardown();
201
202
  } catch (e) {
@@ -209,7 +210,7 @@ import_yargs_extra.default.command(
209
210
  async (argv) => {
210
211
  try {
211
212
  const parsed = parseArguments(config.buildSchema, argv);
212
- const commands = await app.forProject({ ...parsed, version });
213
+ const commands = await app.forProject({ ...parsed, ...pkg });
213
214
  await commands.buildProject(parsed);
214
215
  commands.teardown();
215
216
  } catch (e) {
@@ -223,7 +224,7 @@ import_yargs_extra.default.command(
223
224
  async (argv) => {
224
225
  try {
225
226
  const parsed = parseArguments(config.serveSchema, argv);
226
- const commands = await app.forProject({ ...parsed, version });
227
+ const commands = await app.forProject({ ...parsed, ...pkg });
227
228
  await commands.serveProject(parsed);
228
229
  commands.teardown();
229
230
  } catch (e) {
@@ -237,7 +238,7 @@ import_yargs_extra.default.command(
237
238
  async (argv) => {
238
239
  try {
239
240
  const parsed = parseArguments(config.deploySchema, argv);
240
- const commands = await app.forProject({ ...parsed, version });
241
+ const commands = await app.forProject({ ...parsed, ...pkg });
241
242
  await commands.deployProject(parsed);
242
243
  commands.teardown();
243
244
  } catch (e) {
@@ -251,7 +252,7 @@ import_yargs_extra.default.command(
251
252
  async (argv) => {
252
253
  try {
253
254
  const parsed = parseArguments(config.devSchema, argv);
254
- const commands = await app.forProject({ ...parsed, version });
255
+ const commands = await app.forProject({ ...parsed, ...pkg });
255
256
  await commands.devProject(parsed);
256
257
  commands.teardown();
257
258
  } catch (e) {
@@ -265,7 +266,7 @@ import_yargs_extra.default.command(
265
266
  async (argv) => {
266
267
  try {
267
268
  const parsed = parseArguments(config.addSchema, argv);
268
- const commands = await app.forProject({ ...parsed, version });
269
+ const commands = await app.forProject({ ...parsed, ...pkg });
269
270
  await commands.installIntegration(argv.integrationRef, parsed);
270
271
  commands.teardown();
271
272
  } catch (e) {
@@ -27,6 +27,7 @@ __export(base_logger_exports, {
27
27
  BaseLogger: () => BaseLogger
28
28
  });
29
29
  module.exports = __toCommonJS(base_logger_exports);
30
+ var import_boxen = __toESM(require("boxen"));
30
31
  var import_chalk = __toESM(require("chalk"));
31
32
  var import_lodash = __toESM(require("lodash"));
32
33
  var import_util = __toESM(require("util"));
@@ -76,6 +77,12 @@ const renderers = {
76
77
  "\u25CF": disc,
77
78
  " ": space
78
79
  };
80
+ const BOX_OPTIONS = {
81
+ padding: 1,
82
+ margin: 1,
83
+ borderStyle: "round",
84
+ borderColor: "yellow"
85
+ };
79
86
  class BaseLogger {
80
87
  opts;
81
88
  constructor(opts = {}) {
@@ -127,6 +134,13 @@ class BaseLogger {
127
134
  }
128
135
  this.log(message, { metadata, prefix: { symbol: "\xD7", fg: "red" } });
129
136
  }
137
+ box(message) {
138
+ if (this.opts.json) {
139
+ return;
140
+ }
141
+ const box = (0, import_boxen.default)(message, BOX_OPTIONS);
142
+ this.print(box);
143
+ }
130
144
  _resolvePrefix(prefix) {
131
145
  if (!prefix) {
132
146
  return;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+ var update_notif_exports = {};
26
+ __export(update_notif_exports, {
27
+ notifyUpdate: () => notifyUpdate
28
+ });
29
+ module.exports = __toCommonJS(update_notif_exports);
30
+ var import_chalk = __toESM(require("chalk"));
31
+ var import_latest_version = __toESM(require("latest-version"));
32
+ const updateMsg = (props) => `${import_chalk.default.bold("Update available")} ${import_chalk.default.dim(props.version)} \u2192 ${import_chalk.default.green(props.latest)}
33
+
34
+ To update, run:
35
+ for npm ${import_chalk.default.cyan(`npm i -g ${props.name}`)}
36
+ for yarn ${import_chalk.default.cyan(`yarn global add ${props.name}`)}
37
+ for pnpm ${import_chalk.default.cyan(`pnpm i -g ${props.name}`)}`;
38
+ const notifyUpdate = async (props, logger) => {
39
+ const latest = await (0, import_latest_version.default)(props.name);
40
+ if (latest !== props.version) {
41
+ logger.box(updateMsg({ ...props, latest }));
42
+ }
43
+ };
44
+ // Annotate the CommonJS export names for ESM import in node:
45
+ 0 && (module.exports = {
46
+ notifyUpdate
47
+ });
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+ var watcher_exports = {};
26
+ __export(watcher_exports, {
27
+ FileWatcher: () => FileWatcher
28
+ });
29
+ module.exports = __toCommonJS(watcher_exports);
30
+ var import_watcher = __toESM(require("@parcel/watcher"));
31
+ var import_event_emitter = require("./event-emitter");
32
+ class FileWatcher {
33
+ constructor(subscription, errorEmitter) {
34
+ this.subscription = subscription;
35
+ this.errorEmitter = errorEmitter;
36
+ }
37
+ static async watch(dir, fn, opt) {
38
+ const eventEmitter = new import_event_emitter.EventEmitter();
39
+ const subscription = await import_watcher.default.subscribe(
40
+ dir,
41
+ async (err, events) => {
42
+ if (err) {
43
+ eventEmitter.emit("error", err);
44
+ return;
45
+ }
46
+ try {
47
+ await fn(events);
48
+ } catch (thrown) {
49
+ eventEmitter.emit("error", thrown);
50
+ }
51
+ },
52
+ opt
53
+ );
54
+ return new FileWatcher(subscription, eventEmitter);
55
+ }
56
+ async close() {
57
+ await this.subscription.unsubscribe();
58
+ this.errorEmitter.emit("close", {});
59
+ }
60
+ wait = () => new Promise((resolve, reject) => {
61
+ this.errorEmitter.once("error", reject);
62
+ this.errorEmitter.once("close", resolve);
63
+ });
64
+ }
65
+ // Annotate the CommonJS export names for ESM import in node:
66
+ 0 && (module.exports = {
67
+ FileWatcher
68
+ });
@@ -27,31 +27,21 @@ __export(child_entrypoint_exports, {
27
27
  ENTRY_POINT: () => ENTRY_POINT
28
28
  });
29
29
  module.exports = __toCommonJS(child_entrypoint_exports);
30
- var import_readline = __toESM(require("readline"));
31
30
  var requireutils = __toESM(require("../require-utils"));
32
31
  var import_config = require("./config");
33
32
  var import_is_child = require("./is-child");
34
33
  const ENTRY_POINT = __filename;
35
34
  const childProcessEntrypoint = async (_props) => {
36
- const config = (0, import_config.getConfigFromEnv)();
37
- import_readline.default.emitKeypressEvents(process.stdin);
38
- process.stdin.on("keypress", (_, key) => {
39
- if (key && key.ctrl && key.name === "c") {
40
- process.exit(0);
41
- }
42
- if (key && key.name === "escape") {
43
- process.exit(0);
44
- }
45
- });
46
- if (process.stdin.isTTY) {
47
- process.stdin.setRawMode(true);
35
+ const rawConfig = process.env[import_config.CONFIG_ENV_KEY];
36
+ if (!rawConfig) {
37
+ throw new Error(`Config variable ${import_config.CONFIG_ENV_KEY} was not set`);
48
38
  }
49
- process.stdin.resume();
39
+ const config = import_config.configSchema.parse(JSON.parse(rawConfig));
50
40
  if (config.type === "code") {
51
- await requireutils.requireJsCode(config.code);
41
+ requireutils.requireJsCode(config.code);
52
42
  }
53
43
  if (config.type === "file") {
54
- await requireutils.requireJsFile(config.file);
44
+ requireutils.requireJsFile(config.file);
55
45
  }
56
46
  };
57
47
  if (import_is_child.processProps.type === "child") {
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
+ var child_wrapper_exports = {};
26
+ __export(child_wrapper_exports, {
27
+ ChildProcessWrapper: () => ChildProcessWrapper
28
+ });
29
+ module.exports = __toCommonJS(child_wrapper_exports);
30
+ var childProcess = __toESM(require("child_process"));
31
+ var import_child_entrypoint = require("./child-entrypoint");
32
+ var import_config = require("./config");
33
+ var import_is_child = require("./is-child");
34
+ const listenForChildSpawn = (child, logger) => new Promise((resolve, reject) => {
35
+ child.on("spawn", () => {
36
+ logger.debug(`Child process spawned with pid ${child.pid}`);
37
+ resolve();
38
+ });
39
+ child.on("error", (err) => {
40
+ logger.debug(`Child process error: ${err.message}`);
41
+ reject(err);
42
+ });
43
+ });
44
+ const listenForChildExit = (child, logger) => new Promise((resolve, reject) => {
45
+ child.on("disconnect", () => {
46
+ logger.debug("Child process disconnected");
47
+ });
48
+ child.on("close", (exitCode, signal) => {
49
+ logger.debug(`Child process closed with code ${exitCode} and signal ${signal}`);
50
+ });
51
+ child.on("exit", (exitCode, signal) => {
52
+ logger.debug(`Child process exited with code ${exitCode} and signal ${signal}`);
53
+ resolve({ exitCode, signal });
54
+ });
55
+ child.on("error", (err) => {
56
+ logger.debug(`Child process error: ${err.message}`);
57
+ reject(err);
58
+ });
59
+ child.on("message", (message) => {
60
+ logger.debug(`Child process message: ${message}`);
61
+ });
62
+ });
63
+ class ChildProcessWrapper {
64
+ constructor(_child, _exitPromise) {
65
+ this._child = _child;
66
+ this._exitPromise = _exitPromise;
67
+ }
68
+ static async spawn(config, logger) {
69
+ if (import_is_child.isChildProcess) {
70
+ throw new Error("Cannot spawn child process from child process");
71
+ }
72
+ const child = childProcess.fork(import_child_entrypoint.ENTRY_POINT, [], {
73
+ stdio: "inherit",
74
+ env: {
75
+ [import_is_child.CHILD_ENV_KEY]: import_is_child.CHILD_ENV_VALUE,
76
+ [import_config.CONFIG_ENV_KEY]: JSON.stringify(config),
77
+ ...config.env
78
+ }
79
+ });
80
+ const childSpawnPromise = listenForChildSpawn(child, logger);
81
+ const childExitPromise = listenForChildExit(child, logger);
82
+ const instance = new ChildProcessWrapper(child, childExitPromise);
83
+ childExitPromise.finally(() => {
84
+ instance._exited = true;
85
+ });
86
+ await childSpawnPromise;
87
+ return instance;
88
+ }
89
+ _exited = false;
90
+ async kill() {
91
+ if (this._exited) {
92
+ throw new Error("Child process already exited and cannot be killed");
93
+ }
94
+ this._child.kill();
95
+ const res = await this._exitPromise;
96
+ return res;
97
+ }
98
+ async listen() {
99
+ if (this._exited) {
100
+ throw new Error("Child process already exited and cannot be listened on");
101
+ }
102
+ const res = await this._exitPromise;
103
+ return res;
104
+ }
105
+ }
106
+ // Annotate the CommonJS export names for ESM import in node:
107
+ 0 && (module.exports = {
108
+ ChildProcessWrapper
109
+ });
@@ -25,8 +25,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
25
25
  var config_exports = {};
26
26
  __export(config_exports, {
27
27
  CONFIG_ENV_KEY: () => CONFIG_ENV_KEY,
28
- configSchema: () => configSchema,
29
- getConfigFromEnv: () => getConfigFromEnv
28
+ configSchema: () => configSchema
30
29
  });
31
30
  module.exports = __toCommonJS(config_exports);
32
31
  var import_zod = __toESM(require("zod"));
@@ -43,16 +42,8 @@ const configSchema = import_zod.default.union([
43
42
  env: import_zod.default.record(import_zod.default.string(), import_zod.default.string()).optional()
44
43
  })
45
44
  ]);
46
- const getConfigFromEnv = () => {
47
- const config = process.env[CONFIG_ENV_KEY];
48
- if (!config) {
49
- throw new Error(`Config variable ${CONFIG_ENV_KEY} was not set`);
50
- }
51
- return configSchema.parse(JSON.parse(config));
52
- };
53
45
  // Annotate the CommonJS export names for ESM import in node:
54
46
  0 && (module.exports = {
55
47
  CONFIG_ENV_KEY,
56
- configSchema,
57
- getConfigFromEnv
48
+ configSchema
58
49
  });
@@ -1,9 +1,7 @@
1
1
  "use strict";
2
- var __create = Object.create;
3
2
  var __defProp = Object.defineProperty;
4
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
6
  var __export = (target, all) => {
9
7
  for (var name in all)
@@ -17,39 +15,17 @@ var __copyProps = (to, from, except, desc) => {
17
15
  }
18
16
  return to;
19
17
  };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
19
  var worker_exports = {};
26
20
  __export(worker_exports, {
27
- Config: () => import_config2.Config,
28
- spawnChildProcess: () => spawnChildProcess
21
+ Config: () => import_config.Config,
22
+ Worker: () => import_worker.Worker
29
23
  });
30
24
  module.exports = __toCommonJS(worker_exports);
31
- var childProcess = __toESM(require("child_process"));
32
- var import_child_entrypoint = require("./child-entrypoint");
33
25
  var import_config = require("./config");
34
- var import_is_child = require("./is-child");
35
- var import_listen_child = require("./listen-child");
36
- var import_config2 = require("./config");
37
- const spawnChildProcess = async (config, logger) => {
38
- if (import_is_child.isChildProcess) {
39
- throw new Error("Cannot spawn child process from child process");
40
- }
41
- const child = childProcess.fork(import_child_entrypoint.ENTRY_POINT, [], {
42
- stdio: "inherit",
43
- env: {
44
- [import_is_child.CHILD_ENV_KEY]: import_is_child.CHILD_ENV_VALUE,
45
- [import_config.CONFIG_ENV_KEY]: JSON.stringify(config),
46
- ...config.env
47
- }
48
- });
49
- return (0, import_listen_child.listenChild)(child, logger);
50
- };
26
+ var import_worker = require("./worker");
51
27
  // Annotate the CommonJS export names for ESM import in node:
52
28
  0 && (module.exports = {
53
29
  Config,
54
- spawnChildProcess
30
+ Worker
55
31
  });
@@ -30,7 +30,8 @@ const getProcessProps = () => {
30
30
  const type = process.env[CHILD_ENV_KEY] === CHILD_ENV_VALUE ? "child" : "main";
31
31
  if (type === "main") {
32
32
  return {
33
- type
33
+ type,
34
+ pid: process.pid
34
35
  };
35
36
  }
36
37
  if (!process.send) {
@@ -38,7 +39,8 @@ const getProcessProps = () => {
38
39
  }
39
40
  return {
40
41
  type,
41
- sendMessage: process.send
42
+ sendMessage: process.send,
43
+ pid: process.pid
42
44
  };
43
45
  };
44
46
  const processProps = getProcessProps();
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var worker_state_exports = {};
20
+ __export(worker_state_exports, {
21
+ WorkerStateObserver: () => WorkerStateObserver
22
+ });
23
+ module.exports = __toCommonJS(worker_state_exports);
24
+ class WorkerStateObserver {
25
+ _state;
26
+ _handlers = {
27
+ dead: [],
28
+ reloading: [],
29
+ live: [],
30
+ killing: [],
31
+ errored: []
32
+ };
33
+ constructor(initialState) {
34
+ this._state = initialState;
35
+ }
36
+ waitFor(status) {
37
+ return new Promise((resolve) => {
38
+ const cb = () => {
39
+ this.off(status, cb);
40
+ resolve();
41
+ };
42
+ this.on(status, cb);
43
+ });
44
+ }
45
+ on(status, handler) {
46
+ this._handlers[status].push(handler);
47
+ if (this._state.status === status) {
48
+ handler(this._state);
49
+ }
50
+ }
51
+ off(status, handler) {
52
+ const index = this._handlers[status].indexOf(handler);
53
+ this._handlers[status].splice(index, 1);
54
+ }
55
+ get() {
56
+ return this._state;
57
+ }
58
+ set(newState) {
59
+ this._state = newState;
60
+ const { status } = newState;
61
+ for (const handler of this._handlers[status]) {
62
+ const fn = handler;
63
+ fn(newState);
64
+ }
65
+ }
66
+ }
67
+ // Annotate the CommonJS export names for ESM import in node:
68
+ 0 && (module.exports = {
69
+ WorkerStateObserver
70
+ });
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var worker_exports = {};
20
+ __export(worker_exports, {
21
+ Worker: () => Worker
22
+ });
23
+ module.exports = __toCommonJS(worker_exports);
24
+ var import_child_wrapper = require("./child-wrapper");
25
+ var import_worker_state = require("./worker-state");
26
+ class Worker {
27
+ constructor(_config, _logger, _props = {}) {
28
+ this._config = _config;
29
+ this._logger = _logger;
30
+ this._props = _props;
31
+ }
32
+ static async spawn(config, logger, props) {
33
+ const instance = new Worker(config, logger, props);
34
+ await instance.reload();
35
+ return instance;
36
+ }
37
+ _state = new import_worker_state.WorkerStateObserver({ status: "dead", murdered: false });
38
+ get running() {
39
+ return this._state.get().status === "live";
40
+ }
41
+ kill = () => {
42
+ const state = this._state.get();
43
+ if (state.status !== "live") {
44
+ throw new Error("Cannot kill a child process that is not alive");
45
+ }
46
+ this._state.set({ status: "killing" });
47
+ return state.child.kill();
48
+ };
49
+ reload = async () => {
50
+ if (this._state.get().status === "reloading") {
51
+ this._logger.debug("Already reloading");
52
+ return;
53
+ }
54
+ const previousState = this._state.get();
55
+ this._state.set({ status: "reloading" });
56
+ if (previousState.status === "live") {
57
+ await previousState.child.kill();
58
+ }
59
+ const child = await import_child_wrapper.ChildProcessWrapper.spawn(this._config, this._logger);
60
+ this._state.set({ status: "live", child });
61
+ void child.listen().catch((thrown) => {
62
+ this._state.set({ status: "errored", thrown });
63
+ }).then(() => {
64
+ const { status } = this._state.get();
65
+ if (status === "reloading") {
66
+ return;
67
+ }
68
+ this._state.set({ status: "dead", murdered: status === "killing" });
69
+ });
70
+ };
71
+ wait = () => new Promise((resolve, reject) => {
72
+ this._state.on("dead", (state) => {
73
+ if (state.murdered || !this._props.hangOnExit) {
74
+ resolve();
75
+ return;
76
+ }
77
+ this._logger.debug("Child process died of natural causes...");
78
+ });
79
+ this._state.on("errored", (state) => {
80
+ reject(state.thrown);
81
+ });
82
+ });
83
+ }
84
+ // Annotate the CommonJS export names for ESM import in node:
85
+ 0 && (module.exports = {
86
+ Worker
87
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "0.0.5",
3
+ "version": "0.0.8",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run type-check && pnpm run bundle",
@@ -19,15 +19,18 @@
19
19
  "dependencies": {
20
20
  "@botpress/client": "0.0.6",
21
21
  "@bpinternal/yargs-extra": "^0.0.2",
22
+ "@parcel/watcher": "^2.1.0",
22
23
  "@types/lodash": "^4.14.191",
23
24
  "@types/node": "^18.11.17",
24
25
  "@types/verror": "^1.10.6",
25
26
  "axios": "^1.2.5",
26
27
  "bluebird": "^3.7.2",
28
+ "boxen": "5.1.2",
27
29
  "chalk": "^4.1.2",
28
30
  "chokidar": "^3.5.3",
29
31
  "esbuild": "^0.15.18",
30
32
  "json-schema-to-typescript": "^11.0.2",
33
+ "latest-version": "5.1.0",
31
34
  "lodash": "^4.17.21",
32
35
  "prompts": "^2.4.2",
33
36
  "radash": "^9.5.0",
@@ -40,7 +43,7 @@
40
43
  "zod-to-json-schema": "^3.20.1"
41
44
  },
42
45
  "devDependencies": {
43
- "@botpress/sdk": "0.0.6",
46
+ "@botpress/sdk": "0.0.7",
44
47
  "@types/bluebird": "^3.5.38",
45
48
  "@types/prompts": "^2.0.14",
46
49
  "@types/semver": "^7.3.11",
@@ -1,89 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var listen_child_exports = {};
20
- __export(listen_child_exports, {
21
- listenChild: () => listenChild
22
- });
23
- module.exports = __toCommonJS(listen_child_exports);
24
- const listenChild = async (child, logger) => {
25
- let isClosed = false;
26
- return new Promise((resolve, reject) => {
27
- child.on("close", (code) => {
28
- if (isClosed) {
29
- return;
30
- }
31
- isClosed = true;
32
- const msg = `Child process closed with code ${code}`;
33
- if (code) {
34
- logger.error(msg);
35
- reject(new Error(msg));
36
- return;
37
- }
38
- logger.log(msg);
39
- resolve();
40
- });
41
- child.on("disconnect", () => {
42
- if (isClosed) {
43
- return;
44
- }
45
- const msg = "Child process disconnected";
46
- logger.debug(msg);
47
- });
48
- child.on("exit", (code, signal) => {
49
- if (isClosed) {
50
- return;
51
- }
52
- isClosed = true;
53
- const msg = `Child process exited with code ${code} and signal ${signal}`;
54
- if (code || signal) {
55
- logger.error(msg);
56
- reject(new Error(msg));
57
- return;
58
- }
59
- logger.debug(msg);
60
- resolve();
61
- });
62
- child.on("error", (err) => {
63
- if (isClosed) {
64
- return;
65
- }
66
- const msg = `Child process error: ${err.message}`;
67
- logger.error(msg);
68
- reject(err);
69
- });
70
- child.on("message", (message) => {
71
- if (isClosed) {
72
- return;
73
- }
74
- const msg = `Child process message: ${message}`;
75
- logger.log(msg);
76
- });
77
- child.on("spawn", () => {
78
- if (isClosed) {
79
- return;
80
- }
81
- const msg = "Child process spawned";
82
- logger.debug(msg);
83
- });
84
- });
85
- };
86
- // Annotate the CommonJS export names for ESM import in node:
87
- 0 && (module.exports = {
88
- listenChild
89
- });