@botpress/cli 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/code-generation/integration-instance.js +7 -10
  2. package/dist/code-generation/integration-instance.js.map +2 -2
  3. package/dist/command-implementations/base-command.js +1 -1
  4. package/dist/command-implementations/base-command.js.map +2 -2
  5. package/dist/command-implementations/deploy-command.js +5 -5
  6. package/dist/command-implementations/deploy-command.js.map +2 -2
  7. package/dist/command-implementations/dev-command.js +32 -20
  8. package/dist/command-implementations/dev-command.js.map +2 -2
  9. package/dist/command-implementations/global-command.js +2 -2
  10. package/dist/command-implementations/global-command.js.map +2 -2
  11. package/dist/command-implementations/integration-commands.js.map +2 -2
  12. package/dist/command-implementations/project-command.js.map +2 -2
  13. package/dist/consts.js +4 -0
  14. package/dist/consts.js.map +2 -2
  15. package/dist/index.js +1 -3
  16. package/dist/index.js.map +2 -2
  17. package/dist/init.js.map +2 -2
  18. package/dist/register-yargs.js +4 -3
  19. package/dist/register-yargs.js.map +2 -2
  20. package/dist/root.js +36 -0
  21. package/dist/root.js.map +7 -0
  22. package/dist/typings.js.map +1 -1
  23. package/dist/utils/case-utils.test.js +57 -0
  24. package/dist/utils/case-utils.test.js.map +7 -0
  25. package/dist/utils/index.js +3 -0
  26. package/dist/utils/index.js.map +2 -2
  27. package/dist/utils/require-utils.test.js +31 -0
  28. package/dist/utils/require-utils.test.js.map +7 -0
  29. package/dist/utils/tunnel-utils.js +126 -0
  30. package/dist/utils/tunnel-utils.js.map +7 -0
  31. package/dist/worker/child-wrapper.js +4 -0
  32. package/dist/worker/child-wrapper.js.map +2 -2
  33. package/package.json +3 -3
  34. package/templates/echo-bot/package.json +3 -4
  35. package/templates/echo-bot/tsconfig.json +14 -1
  36. package/templates/empty-integration/package.json +3 -4
  37. package/templates/empty-integration/tsconfig.json +14 -1
package/dist/index.js CHANGED
@@ -24,8 +24,6 @@ var tree = __toESM(require("./command-tree"));
24
24
  var errors = __toESM(require("./errors"));
25
25
  var import_logger = require("./logger");
26
26
  var import_register_yargs = require("./register-yargs");
27
- var utils = __toESM(require("./utils"));
28
- const CLI_ROOT_DIR = utils.path.join(__dirname, "..");
29
27
  const logError = (thrown) => {
30
28
  const error = errors.BotpressCLIError.map(thrown);
31
29
  new import_logger.Logger().error(error.message);
@@ -43,6 +41,6 @@ const yargsFail = (msg) => {
43
41
  process.on("uncaughtException", (thrown) => onError(thrown));
44
42
  process.on("unhandledRejection", (thrown) => onError(thrown));
45
43
  const commands = tree.zipTree(import_command_definitions.default, import_command_implementations.default);
46
- (0, import_register_yargs.registerYargs)(import_yargs_extra.default, commands, { cliRootDir: CLI_ROOT_DIR });
44
+ (0, import_register_yargs.registerYargs)(import_yargs_extra.default, commands);
47
45
  void import_yargs_extra.default.version().scriptName("bp").demandCommand(1, "You didn't provide any command. Use the --help flag to see the list of available commands.").recommendCommands().strict().help().fail(yargsFail).parse();
48
46
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts"],
4
- "sourcesContent": ["import yargs from '@bpinternal/yargs-extra'\nimport commandDefinitions from './command-definitions'\nimport commandImplementations from './command-implementations'\nimport * as tree from './command-tree'\nimport * as errors from './errors'\nimport { Logger } from './logger'\nimport { registerYargs } from './register-yargs'\nimport * as utils from './utils'\n\nconst CLI_ROOT_DIR = utils.path.join(__dirname as utils.path.AbsolutePath, '..')\n\nconst logError = (thrown: unknown) => {\n const error = errors.BotpressCLIError.map(thrown)\n new Logger().error(error.message)\n}\n\nconst onError = (thrown: unknown) => {\n logError(thrown)\n process.exit(1)\n}\n\nconst yargsFail = (msg: string) => {\n logError(`${msg}\\n`)\n yargs.showHelp()\n process.exit(1)\n}\n\nprocess.on('uncaughtException', (thrown: unknown) => onError(thrown))\nprocess.on('unhandledRejection', (thrown: unknown) => onError(thrown))\n\nconst commands = tree.zipTree(commandDefinitions, commandImplementations)\n\nregisterYargs(yargs, commands, { cliRootDir: CLI_ROOT_DIR })\n\nvoid yargs\n .version()\n .scriptName('bp')\n .demandCommand(1, \"You didn't provide any command. Use the --help flag to see the list of available commands.\")\n .recommendCommands()\n .strict()\n .help()\n .fail(yargsFail)\n .parse()\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,yBAAkB;AAClB,iCAA+B;AAC/B,qCAAmC;AACnC,WAAsB;AACtB,aAAwB;AACxB,oBAAuB;AACvB,4BAA8B;AAC9B,YAAuB;AAEvB,MAAM,eAAe,MAAM,KAAK,KAAK,WAAsC,IAAI;AAE/E,MAAM,WAAW,CAAC,WAAoB;AACpC,QAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;AAChD,MAAI,qBAAO,EAAE,MAAM,MAAM,OAAO;AAClC;AAEA,MAAM,UAAU,CAAC,WAAoB;AACnC,WAAS,MAAM;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,MAAM,YAAY,CAAC,QAAgB;AACjC,WAAS,GAAG;AAAA,CAAO;AACnB,qBAAAA,QAAM,SAAS;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,GAAG,qBAAqB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AACpE,QAAQ,GAAG,sBAAsB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AAErE,MAAM,WAAW,KAAK,QAAQ,2BAAAC,SAAoB,+BAAAC,OAAsB;AAAA,IAExE,qCAAc,mBAAAF,SAAO,UAAU,EAAE,YAAY,aAAa,CAAC;AAE3D,KAAK,mBAAAA,QACF,QAAQ,EACR,WAAW,IAAI,EACf,cAAc,GAAG,4FAA4F,EAC7G,kBAAkB,EAClB,OAAO,EACP,KAAK,EACL,KAAK,SAAS,EACd,MAAM;",
4
+ "sourcesContent": ["import yargs from '@bpinternal/yargs-extra'\nimport commandDefinitions from './command-definitions'\nimport commandImplementations from './command-implementations'\nimport * as tree from './command-tree'\nimport * as errors from './errors'\nimport { Logger } from './logger'\nimport { registerYargs } from './register-yargs'\n\nconst logError = (thrown: unknown) => {\n const error = errors.BotpressCLIError.map(thrown)\n new Logger().error(error.message)\n}\n\nconst onError = (thrown: unknown) => {\n logError(thrown)\n process.exit(1)\n}\n\nconst yargsFail = (msg: string) => {\n logError(`${msg}\\n`)\n yargs.showHelp()\n process.exit(1)\n}\n\nprocess.on('uncaughtException', (thrown: unknown) => onError(thrown))\nprocess.on('unhandledRejection', (thrown: unknown) => onError(thrown))\n\nconst commands = tree.zipTree(commandDefinitions, commandImplementations)\n\nregisterYargs(yargs, commands)\n\nvoid yargs\n .version()\n .scriptName('bp')\n .demandCommand(1, \"You didn't provide any command. Use the --help flag to see the list of available commands.\")\n .recommendCommands()\n .strict()\n .help()\n .fail(yargsFail)\n .parse()\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,yBAAkB;AAClB,iCAA+B;AAC/B,qCAAmC;AACnC,WAAsB;AACtB,aAAwB;AACxB,oBAAuB;AACvB,4BAA8B;AAE9B,MAAM,WAAW,CAAC,WAAoB;AACpC,QAAM,QAAQ,OAAO,iBAAiB,IAAI,MAAM;AAChD,MAAI,qBAAO,EAAE,MAAM,MAAM,OAAO;AAClC;AAEA,MAAM,UAAU,CAAC,WAAoB;AACnC,WAAS,MAAM;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,MAAM,YAAY,CAAC,QAAgB;AACjC,WAAS,GAAG;AAAA,CAAO;AACnB,qBAAAA,QAAM,SAAS;AACf,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,GAAG,qBAAqB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AACpE,QAAQ,GAAG,sBAAsB,CAAC,WAAoB,QAAQ,MAAM,CAAC;AAErE,MAAM,WAAW,KAAK,QAAQ,2BAAAC,SAAoB,+BAAAC,OAAsB;AAAA,IAExE,qCAAc,mBAAAF,SAAO,QAAQ;AAE7B,KAAK,mBAAAA,QACF,QAAQ,EACR,WAAW,IAAI,EACf,cAAc,GAAG,4FAA4F,EAC7G,kBAAkB,EAClB,OAAO,EACP,KAAK,EACL,KAAK,SAAS,EACd,MAAM;",
6
6
  "names": ["yargs", "commandDefinitions", "commandImplementations"]
7
7
  }
package/dist/init.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/init.ts"],
4
- "sourcesContent": ["import Module from 'module'\nimport pathlib from 'path'\n\nconst DEFAULT_DIRNAME = '.botpress'\n\nconst getOutDir = () => {\n const { BP_OUTDIR } = process.env\n if (!BP_OUTDIR) {\n return pathlib.join(process.cwd(), DEFAULT_DIRNAME)\n }\n if (pathlib.isAbsolute(BP_OUTDIR)) {\n return BP_OUTDIR\n }\n return pathlib.join(process.cwd(), BP_OUTDIR)\n}\n\nconst outDirPath = getOutDir()\nconst outDirName = pathlib.basename(outDirPath)\nconst originalRequire = Module.prototype.require\n\nconst rewire = function (this: NodeRequire, mod: string) {\n const importParts = mod.split('/')\n\n if (importParts[0] === outDirName) {\n const newMod = importParts.slice(1).join('/')\n const fullpath = pathlib.join(outDirPath, newMod)\n return originalRequire.apply(this, [fullpath])\n }\n\n return originalRequire.apply(this, [mod])\n} as NodeRequire\n\nModule.prototype.require = rewire\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,oBAAmB;AACnB,kBAAoB;AAEpB,MAAM,kBAAkB;AAExB,MAAM,YAAY,MAAM;AACtB,QAAM,EAAE,UAAU,IAAI,QAAQ;AAC9B,MAAI,CAAC,WAAW;AACd,WAAO,YAAAA,QAAQ,KAAK,QAAQ,IAAI,GAAG,eAAe;AAAA,EACpD;AACA,MAAI,YAAAA,QAAQ,WAAW,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AACA,SAAO,YAAAA,QAAQ,KAAK,QAAQ,IAAI,GAAG,SAAS;AAC9C;AAEA,MAAM,aAAa,UAAU;AAC7B,MAAM,aAAa,YAAAA,QAAQ,SAAS,UAAU;AAC9C,MAAM,kBAAkB,cAAAC,QAAO,UAAU;AAEzC,MAAM,SAAS,SAA6B,KAAa;AACvD,QAAM,cAAc,IAAI,MAAM,GAAG;AAEjC,MAAI,YAAY,OAAO,YAAY;AACjC,UAAM,SAAS,YAAY,MAAM,CAAC,EAAE,KAAK,GAAG;AAC5C,UAAM,WAAW,YAAAD,QAAQ,KAAK,YAAY,MAAM;AAChD,WAAO,gBAAgB,MAAM,MAAM,CAAC,QAAQ,CAAC;AAAA,EAC/C;AAEA,SAAO,gBAAgB,MAAM,MAAM,CAAC,GAAG,CAAC;AAC1C;AAEA,cAAAC,QAAO,UAAU,UAAU;",
4
+ "sourcesContent": ["/**\n * Important:\n *\n * This file must be kept at the root of the src directory (and dist directory when built)\n */\nimport Module from 'module'\nimport pathlib from 'path'\n\nconst DEFAULT_DIRNAME = '.botpress'\n\nconst getOutDir = () => {\n const { BP_OUTDIR } = process.env\n if (!BP_OUTDIR) {\n return pathlib.join(process.cwd(), DEFAULT_DIRNAME)\n }\n if (pathlib.isAbsolute(BP_OUTDIR)) {\n return BP_OUTDIR\n }\n return pathlib.join(process.cwd(), BP_OUTDIR)\n}\n\nconst outDirPath = getOutDir()\nconst outDirName = pathlib.basename(outDirPath)\nconst originalRequire = Module.prototype.require\n\nconst rewire = function (this: NodeRequire, mod: string) {\n const importParts = mod.split('/')\n\n if (importParts[0] === outDirName) {\n const newMod = importParts.slice(1).join('/')\n const fullpath = pathlib.join(outDirPath, newMod)\n return originalRequire.apply(this, [fullpath])\n }\n\n return originalRequire.apply(this, [mod])\n} as NodeRequire\n\nModule.prototype.require = rewire\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAKA,oBAAmB;AACnB,kBAAoB;AAEpB,MAAM,kBAAkB;AAExB,MAAM,YAAY,MAAM;AACtB,QAAM,EAAE,UAAU,IAAI,QAAQ;AAC9B,MAAI,CAAC,WAAW;AACd,WAAO,YAAAA,QAAQ,KAAK,QAAQ,IAAI,GAAG,eAAe;AAAA,EACpD;AACA,MAAI,YAAAA,QAAQ,WAAW,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AACA,SAAO,YAAAA,QAAQ,KAAK,QAAQ,IAAI,GAAG,SAAS;AAC9C;AAEA,MAAM,aAAa,UAAU;AAC7B,MAAM,aAAa,YAAAA,QAAQ,SAAS,UAAU;AAC9C,MAAM,kBAAkB,cAAAC,QAAO,UAAU;AAEzC,MAAM,SAAS,SAA6B,KAAa;AACvD,QAAM,cAAc,IAAI,MAAM,GAAG;AAEjC,MAAI,YAAY,OAAO,YAAY;AACjC,UAAM,SAAS,YAAY,MAAM,CAAC,EAAE,KAAK,GAAG;AAC5C,UAAM,WAAW,YAAAD,QAAQ,KAAK,YAAY,MAAM;AAChD,WAAO,gBAAgB,MAAM,MAAM,CAAC,QAAQ,CAAC;AAAA,EAC/C;AAEA,SAAO,gBAAgB,MAAM,MAAM,CAAC,GAAG,CAAC;AAC1C;AAEA,cAAAC,QAAO,UAAU,UAAU;",
6
6
  "names": ["pathlib", "Module"]
7
7
  }
@@ -34,12 +34,12 @@ const parseArguments = (schema, argv) => {
34
34
  const yargsEnv = (0, import_yargs_extra.parseEnv)(schema, "BP");
35
35
  return (0, import_yargs_extra.cleanupConfig)(schema, { ...argv, ...yargsEnv });
36
36
  };
37
- const registerYargs = (yargz, commands, props) => {
37
+ const registerYargs = (yargz, commands) => {
38
38
  for (const cmdName in commands) {
39
39
  const command = commands[cmdName];
40
40
  if (tree.guards.command.isSubTree(command)) {
41
41
  yargz.command(cmdName, command.description ?? cmdName, (y) => {
42
- registerYargs(y, command.subcommands, props);
42
+ registerYargs(y, command.subcommands);
43
43
  return y;
44
44
  });
45
45
  continue;
@@ -74,7 +74,8 @@ const registerYargs = (yargz, commands, props) => {
74
74
  },
75
75
  async (argv) => {
76
76
  const parsed = parseArguments(schema, argv);
77
- await command.handler({ ...parsed, ...props });
77
+ const { exitCode } = await command.handler({ ...parsed });
78
+ process.exit(exitCode);
78
79
  }
79
80
  );
80
81
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/register-yargs.ts"],
4
- "sourcesContent": ["import yargs, { YargsArgv, YargsConfig, cleanupConfig, parseEnv } from '@bpinternal/yargs-extra'\nimport _ from 'lodash'\nimport * as tree from './command-tree'\nimport type * as typings from './typings'\nimport type * as utils from './utils'\n\nexport type YargsInstance = typeof yargs\n\nexport type RegisterProps = {\n cliRootDir: utils.path.AbsolutePath\n}\n\nconst parseArguments = <S extends typings.CommandSchema>(schema: S, argv: YargsArgv<S>): YargsConfig<S> => {\n const yargsEnv = parseEnv(schema, 'BP')\n return cleanupConfig(schema, { ...argv, ...yargsEnv })\n}\n\nexport const registerYargs = (yargz: YargsInstance, commands: tree.CommandTree, props: RegisterProps) => {\n for (const cmdName in commands) {\n const command = commands[cmdName] as tree.CommandTreeNode\n\n if (tree.guards.command.isSubTree(command)) {\n yargz.command(cmdName, command.description ?? cmdName, (y) => {\n registerYargs(y, command.subcommands, props)\n return y\n })\n continue\n }\n\n const { schema, description, alias } = command\n const aliases = alias ? [cmdName, alias] : [cmdName]\n\n const options = Object.entries(schema)\n let positionals = options.filter(\n (value): value is [string, typings.CommandPositionalOption] => !!value[1].positional\n )\n\n let usage = aliases\n if (positionals.length) {\n positionals = _.sortBy(positionals, ([, option]) => option.idx)\n const positionalArgs = positionals.map(([optName, option]) =>\n option.demandOption ? `<${optName}>` : `[${optName}]`\n )\n const positionalStr = positionalArgs.join(' ')\n usage = aliases.map((optAlias) => `${optAlias} ${positionalStr}`)\n }\n\n yargz.command(\n usage,\n description ?? cmdName,\n (y) => {\n for (const [key, option] of Object.entries(schema)) {\n if (option.positional) {\n y = y.positional(key, option)\n } else {\n y = y.option(key, option)\n }\n }\n return y\n },\n async (argv) => {\n const parsed = parseArguments(schema, argv)\n await command.handler({ ...parsed, ...props })\n }\n )\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuE;AACvE,oBAAc;AACd,WAAsB;AAUtB,MAAM,iBAAiB,CAAkC,QAAW,SAAuC;AACzG,QAAM,eAAW,6BAAS,QAAQ,IAAI;AACtC,aAAO,kCAAc,QAAQ,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;AACvD;AAEO,MAAM,gBAAgB,CAAC,OAAsB,UAA4B,UAAyB;AACvG,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,SAAS;AAEzB,QAAI,KAAK,OAAO,QAAQ,UAAU,OAAO,GAAG;AAC1C,YAAM,QAAQ,SAAS,QAAQ,eAAe,SAAS,CAAC,MAAM;AAC5D,sBAAc,GAAG,QAAQ,aAAa,KAAK;AAC3C,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,aAAa,MAAM,IAAI;AACvC,UAAM,UAAU,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO;AAEnD,UAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,QAAI,cAAc,QAAQ;AAAA,MACxB,CAAC,UAA8D,CAAC,CAAC,MAAM,GAAG;AAAA,IAC5E;AAEA,QAAI,QAAQ;AACZ,QAAI,YAAY,QAAQ;AACtB,oBAAc,cAAAA,QAAE,OAAO,aAAa,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,GAAG;AAC9D,YAAM,iBAAiB,YAAY;AAAA,QAAI,CAAC,CAAC,SAAS,MAAM,MACtD,OAAO,eAAe,IAAI,aAAa,IAAI;AAAA,MAC7C;AACA,YAAM,gBAAgB,eAAe,KAAK,GAAG;AAC7C,cAAQ,QAAQ,IAAI,CAAC,aAAa,GAAG,YAAY,eAAe;AAAA,IAClE;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,MACf,CAAC,MAAM;AACL,mBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,cAAI,OAAO,YAAY;AACrB,gBAAI,EAAE,WAAW,KAAK,MAAM;AAAA,UAC9B,OAAO;AACL,gBAAI,EAAE,OAAO,KAAK,MAAM;AAAA,UAC1B;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,OAAO,SAAS;AACd,cAAM,SAAS,eAAe,QAAQ,IAAI;AAC1C,cAAM,QAAQ,QAAQ,EAAE,GAAG,QAAQ,GAAG,MAAM,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import yargs, { YargsArgv, YargsConfig, cleanupConfig, parseEnv } from '@bpinternal/yargs-extra'\nimport _ from 'lodash'\nimport * as tree from './command-tree'\nimport type * as typings from './typings'\n\nexport type YargsInstance = typeof yargs\n\nconst parseArguments = <S extends typings.CommandSchema>(schema: S, argv: YargsArgv<S>): YargsConfig<S> => {\n const yargsEnv = parseEnv(schema, 'BP')\n return cleanupConfig(schema, { ...argv, ...yargsEnv })\n}\n\nexport const registerYargs = (yargz: YargsInstance, commands: tree.CommandTree) => {\n for (const cmdName in commands) {\n const command = commands[cmdName] as tree.CommandTreeNode\n\n if (tree.guards.command.isSubTree(command)) {\n yargz.command(cmdName, command.description ?? cmdName, (y) => {\n registerYargs(y, command.subcommands)\n return y\n })\n continue\n }\n\n const { schema, description, alias } = command\n const aliases = alias ? [cmdName, alias] : [cmdName]\n\n const options = Object.entries(schema)\n let positionals = options.filter(\n (value): value is [string, typings.CommandPositionalOption] => !!value[1].positional\n )\n\n let usage = aliases\n if (positionals.length) {\n positionals = _.sortBy(positionals, ([, option]) => option.idx)\n const positionalArgs = positionals.map(([optName, option]) =>\n option.demandOption ? `<${optName}>` : `[${optName}]`\n )\n const positionalStr = positionalArgs.join(' ')\n usage = aliases.map((optAlias) => `${optAlias} ${positionalStr}`)\n }\n\n yargz.command(\n usage,\n description ?? cmdName,\n (y) => {\n for (const [key, option] of Object.entries(schema)) {\n if (option.positional) {\n y = y.positional(key, option)\n } else {\n y = y.option(key, option)\n }\n }\n return y\n },\n async (argv) => {\n const parsed = parseArguments(schema, argv)\n const { exitCode } = await command.handler({ ...parsed })\n process.exit(exitCode)\n }\n )\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAuE;AACvE,oBAAc;AACd,WAAsB;AAKtB,MAAM,iBAAiB,CAAkC,QAAW,SAAuC;AACzG,QAAM,eAAW,6BAAS,QAAQ,IAAI;AACtC,aAAO,kCAAc,QAAQ,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;AACvD;AAEO,MAAM,gBAAgB,CAAC,OAAsB,aAA+B;AACjF,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,SAAS;AAEzB,QAAI,KAAK,OAAO,QAAQ,UAAU,OAAO,GAAG;AAC1C,YAAM,QAAQ,SAAS,QAAQ,eAAe,SAAS,CAAC,MAAM;AAC5D,sBAAc,GAAG,QAAQ,WAAW;AACpC,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,aAAa,MAAM,IAAI;AACvC,UAAM,UAAU,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO;AAEnD,UAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,QAAI,cAAc,QAAQ;AAAA,MACxB,CAAC,UAA8D,CAAC,CAAC,MAAM,GAAG;AAAA,IAC5E;AAEA,QAAI,QAAQ;AACZ,QAAI,YAAY,QAAQ;AACtB,oBAAc,cAAAA,QAAE,OAAO,aAAa,CAAC,CAAC,EAAE,MAAM,MAAM,OAAO,GAAG;AAC9D,YAAM,iBAAiB,YAAY;AAAA,QAAI,CAAC,CAAC,SAAS,MAAM,MACtD,OAAO,eAAe,IAAI,aAAa,IAAI;AAAA,MAC7C;AACA,YAAM,gBAAgB,eAAe,KAAK,GAAG;AAC7C,cAAQ,QAAQ,IAAI,CAAC,aAAa,GAAG,YAAY,eAAe;AAAA,IAClE;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,MACf,CAAC,MAAM;AACL,mBAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,cAAI,OAAO,YAAY;AACrB,gBAAI,EAAE,WAAW,KAAK,MAAM;AAAA,UAC9B,OAAO;AACL,gBAAI,EAAE,OAAO,KAAK,MAAM;AAAA,UAC1B;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,OAAO,SAAS;AACd,cAAM,SAAS,eAAe,QAAQ,IAAI;AAC1C,cAAM,EAAE,SAAS,IAAI,MAAM,QAAQ,QAAQ,EAAE,GAAG,OAAO,CAAC;AACxD,gBAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AACF;",
6
6
  "names": ["_"]
7
7
  }
package/dist/root.js ADDED
@@ -0,0 +1,36 @@
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 root_exports = {};
26
+ __export(root_exports, {
27
+ CLI_ROOT_DIR: () => CLI_ROOT_DIR
28
+ });
29
+ module.exports = __toCommonJS(root_exports);
30
+ var utils = __toESM(require("./utils"));
31
+ const CLI_ROOT_DIR = utils.path.join(__dirname, "..");
32
+ // Annotate the CommonJS export names for ESM import in node:
33
+ 0 && (module.exports = {
34
+ CLI_ROOT_DIR
35
+ });
36
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/root.ts"],
4
+ "sourcesContent": ["/**\n * Important:\n *\n * This file must be kept at the root of the src directory (and dist directory when built)\n */\nimport * as utils from './utils'\n\nexport const CLI_ROOT_DIR = utils.path.join(__dirname as utils.path.AbsolutePath, '..')\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,YAAuB;AAEhB,MAAM,eAAe,MAAM,KAAK,KAAK,WAAsC,IAAI;",
6
+ "names": []
7
+ }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/typings.ts"],
4
- "sourcesContent": ["import type yargs from '@bpinternal/yargs-extra'\n// eslint-disable-next-line no-duplicate-imports\nimport type { YargsConfig, YargsSchema } from '@bpinternal/yargs-extra'\nimport type * as utils from './utils'\n\nexport type CommandPositionalOption = yargs.PositionalOptions & { positional: true; idx: number }\nexport type CommandNamedOption = YargsSchema[string] & { positional?: false }\nexport type CommandOption = CommandPositionalOption | CommandNamedOption\nexport type CommandSchema = Record<string, CommandOption>\n\nexport type CommandArgv<C extends CommandDefinition = CommandDefinition> = YargsConfig<C['schema']> & {\n cliRootDir: utils.path.AbsolutePath\n}\n\nexport type CommandDefinition<S extends CommandSchema = CommandSchema> = {\n schema: S\n description?: string\n alias?: string\n}\n\nexport type CommandImplementation<C extends CommandDefinition = CommandDefinition> = (\n argv: CommandArgv<C>\n) => Promise<never>\n\nexport type CommandLeaf<C extends CommandDefinition = CommandDefinition> = C & {\n handler: CommandImplementation<C>\n}\n"],
4
+ "sourcesContent": ["import type yargs from '@bpinternal/yargs-extra'\n// eslint-disable-next-line no-duplicate-imports\nimport type { YargsConfig, YargsSchema } from '@bpinternal/yargs-extra'\n\nexport type CommandPositionalOption = yargs.PositionalOptions & { positional: true; idx: number }\nexport type CommandNamedOption = YargsSchema[string] & { positional?: false }\nexport type CommandOption = CommandPositionalOption | CommandNamedOption\nexport type CommandSchema = Record<string, CommandOption>\n\nexport type CommandArgv<C extends CommandDefinition = CommandDefinition> = YargsConfig<C['schema']> & {\n /**\n * Ignored: fixes weird typing issue\n */\n _?: string\n}\n\nexport type CommandDefinition<S extends CommandSchema = CommandSchema> = {\n schema: S\n description?: string\n alias?: string\n}\n\nexport type CommandImplementation<C extends CommandDefinition = CommandDefinition> = (\n argv: CommandArgv<C>\n) => Promise<{ exitCode: number }>\n\nexport type CommandLeaf<C extends CommandDefinition = CommandDefinition> = C & {\n handler: CommandImplementation<C>\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,57 @@
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 __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
18
+ mod
19
+ ));
20
+ var import_vitest = require("vitest");
21
+ var caseUtils = __toESM(require("./case-utils"));
22
+ const pascalCase = "HelloWorld";
23
+ const kebabCase = "hello-world";
24
+ const snakeCase = "hello_world";
25
+ const screamingSnakeCase = "HELLO_WORLD";
26
+ const camelCase = "helloWorld";
27
+ (0, import_vitest.test)("case utils should convert from pascal case to all other cases", () => {
28
+ (0, import_vitest.expect)(caseUtils.to.kebabCase(pascalCase)).toBe(kebabCase);
29
+ (0, import_vitest.expect)(caseUtils.to.snakeCase(pascalCase)).toBe(snakeCase);
30
+ (0, import_vitest.expect)(caseUtils.to.screamingSnakeCase(pascalCase)).toBe(screamingSnakeCase);
31
+ (0, import_vitest.expect)(caseUtils.to.camelCase(pascalCase)).toBe(camelCase);
32
+ });
33
+ (0, import_vitest.test)("case utils should convert from kebab case to all other cases", () => {
34
+ (0, import_vitest.expect)(caseUtils.to.pascalCase(kebabCase)).toBe(pascalCase);
35
+ (0, import_vitest.expect)(caseUtils.to.snakeCase(kebabCase)).toBe(snakeCase);
36
+ (0, import_vitest.expect)(caseUtils.to.screamingSnakeCase(kebabCase)).toBe(screamingSnakeCase);
37
+ (0, import_vitest.expect)(caseUtils.to.camelCase(kebabCase)).toBe(camelCase);
38
+ });
39
+ (0, import_vitest.test)("case utils should convert from snake case to all other cases", () => {
40
+ (0, import_vitest.expect)(caseUtils.to.pascalCase(snakeCase)).toBe(pascalCase);
41
+ (0, import_vitest.expect)(caseUtils.to.kebabCase(snakeCase)).toBe(kebabCase);
42
+ (0, import_vitest.expect)(caseUtils.to.screamingSnakeCase(snakeCase)).toBe(screamingSnakeCase);
43
+ (0, import_vitest.expect)(caseUtils.to.camelCase(snakeCase)).toBe(camelCase);
44
+ });
45
+ (0, import_vitest.test)("case utils should convert from screaming snake case to all other cases", () => {
46
+ (0, import_vitest.expect)(caseUtils.to.pascalCase(screamingSnakeCase)).toBe(pascalCase);
47
+ (0, import_vitest.expect)(caseUtils.to.kebabCase(screamingSnakeCase)).toBe(kebabCase);
48
+ (0, import_vitest.expect)(caseUtils.to.snakeCase(screamingSnakeCase)).toBe(snakeCase);
49
+ (0, import_vitest.expect)(caseUtils.to.camelCase(screamingSnakeCase)).toBe(camelCase);
50
+ });
51
+ (0, import_vitest.test)("case utils should convert from camel case to all other cases", () => {
52
+ (0, import_vitest.expect)(caseUtils.to.pascalCase(camelCase)).toBe(pascalCase);
53
+ (0, import_vitest.expect)(caseUtils.to.kebabCase(camelCase)).toBe(kebabCase);
54
+ (0, import_vitest.expect)(caseUtils.to.snakeCase(camelCase)).toBe(snakeCase);
55
+ (0, import_vitest.expect)(caseUtils.to.screamingSnakeCase(camelCase)).toBe(screamingSnakeCase);
56
+ });
57
+ //# sourceMappingURL=case-utils.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/case-utils.test.ts"],
4
+ "sourcesContent": ["import { test, expect } from 'vitest'\nimport * as caseUtils from './case-utils'\n\nconst pascalCase = 'HelloWorld'\nconst kebabCase = 'hello-world'\nconst snakeCase = 'hello_world'\nconst screamingSnakeCase = 'HELLO_WORLD'\nconst camelCase = 'helloWorld'\n\ntest('case utils should convert from pascal case to all other cases', () => {\n expect(caseUtils.to.kebabCase(pascalCase)).toBe(kebabCase)\n expect(caseUtils.to.snakeCase(pascalCase)).toBe(snakeCase)\n expect(caseUtils.to.screamingSnakeCase(pascalCase)).toBe(screamingSnakeCase)\n expect(caseUtils.to.camelCase(pascalCase)).toBe(camelCase)\n})\n\ntest('case utils should convert from kebab case to all other cases', () => {\n expect(caseUtils.to.pascalCase(kebabCase)).toBe(pascalCase)\n expect(caseUtils.to.snakeCase(kebabCase)).toBe(snakeCase)\n expect(caseUtils.to.screamingSnakeCase(kebabCase)).toBe(screamingSnakeCase)\n expect(caseUtils.to.camelCase(kebabCase)).toBe(camelCase)\n})\n\ntest('case utils should convert from snake case to all other cases', () => {\n expect(caseUtils.to.pascalCase(snakeCase)).toBe(pascalCase)\n expect(caseUtils.to.kebabCase(snakeCase)).toBe(kebabCase)\n expect(caseUtils.to.screamingSnakeCase(snakeCase)).toBe(screamingSnakeCase)\n expect(caseUtils.to.camelCase(snakeCase)).toBe(camelCase)\n})\n\ntest('case utils should convert from screaming snake case to all other cases', () => {\n expect(caseUtils.to.pascalCase(screamingSnakeCase)).toBe(pascalCase)\n expect(caseUtils.to.kebabCase(screamingSnakeCase)).toBe(kebabCase)\n expect(caseUtils.to.snakeCase(screamingSnakeCase)).toBe(snakeCase)\n expect(caseUtils.to.camelCase(screamingSnakeCase)).toBe(camelCase)\n})\n\ntest('case utils should convert from camel case to all other cases', () => {\n expect(caseUtils.to.pascalCase(camelCase)).toBe(pascalCase)\n expect(caseUtils.to.kebabCase(camelCase)).toBe(kebabCase)\n expect(caseUtils.to.snakeCase(camelCase)).toBe(snakeCase)\n expect(caseUtils.to.screamingSnakeCase(camelCase)).toBe(screamingSnakeCase)\n})\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,oBAA6B;AAC7B,gBAA2B;AAE3B,MAAM,aAAa;AACnB,MAAM,YAAY;AAClB,MAAM,YAAY;AAClB,MAAM,qBAAqB;AAC3B,MAAM,YAAY;AAAA,IAElB,oBAAK,iEAAiE,MAAM;AAC1E,4BAAO,UAAU,GAAG,UAAU,UAAU,CAAC,EAAE,KAAK,SAAS;AACzD,4BAAO,UAAU,GAAG,UAAU,UAAU,CAAC,EAAE,KAAK,SAAS;AACzD,4BAAO,UAAU,GAAG,mBAAmB,UAAU,CAAC,EAAE,KAAK,kBAAkB;AAC3E,4BAAO,UAAU,GAAG,UAAU,UAAU,CAAC,EAAE,KAAK,SAAS;AAC3D,CAAC;AAAA,IAED,oBAAK,gEAAgE,MAAM;AACzE,4BAAO,UAAU,GAAG,WAAW,SAAS,CAAC,EAAE,KAAK,UAAU;AAC1D,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AACxD,4BAAO,UAAU,GAAG,mBAAmB,SAAS,CAAC,EAAE,KAAK,kBAAkB;AAC1E,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AAC1D,CAAC;AAAA,IAED,oBAAK,gEAAgE,MAAM;AACzE,4BAAO,UAAU,GAAG,WAAW,SAAS,CAAC,EAAE,KAAK,UAAU;AAC1D,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AACxD,4BAAO,UAAU,GAAG,mBAAmB,SAAS,CAAC,EAAE,KAAK,kBAAkB;AAC1E,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AAC1D,CAAC;AAAA,IAED,oBAAK,0EAA0E,MAAM;AACnF,4BAAO,UAAU,GAAG,WAAW,kBAAkB,CAAC,EAAE,KAAK,UAAU;AACnE,4BAAO,UAAU,GAAG,UAAU,kBAAkB,CAAC,EAAE,KAAK,SAAS;AACjE,4BAAO,UAAU,GAAG,UAAU,kBAAkB,CAAC,EAAE,KAAK,SAAS;AACjE,4BAAO,UAAU,GAAG,UAAU,kBAAkB,CAAC,EAAE,KAAK,SAAS;AACnE,CAAC;AAAA,IAED,oBAAK,gEAAgE,MAAM;AACzE,4BAAO,UAAU,GAAG,WAAW,SAAS,CAAC,EAAE,KAAK,UAAU;AAC1D,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AACxD,4BAAO,UAAU,GAAG,UAAU,SAAS,CAAC,EAAE,KAAK,SAAS;AACxD,4BAAO,UAAU,GAAG,mBAAmB,SAAS,CAAC,EAAE,KAAK,kBAAkB;AAC5E,CAAC;",
6
+ "names": []
7
+ }
@@ -33,6 +33,7 @@ __export(utils_exports, {
33
33
  prompt: () => prompt,
34
34
  records: () => records,
35
35
  require: () => require2,
36
+ tunnel: () => tunnel,
36
37
  url: () => url
37
38
  });
38
39
  module.exports = __toCommonJS(utils_exports);
@@ -46,6 +47,7 @@ var casing = __toESM(require("./case-utils"));
46
47
  var prompt = __toESM(require("./prompt-utils"));
47
48
  var records = __toESM(require("./record-utils"));
48
49
  var url = __toESM(require("./url-utils"));
50
+ var tunnel = __toESM(require("./tunnel-utils"));
49
51
  // Annotate the CommonJS export names for ESM import in node:
50
52
  0 && (module.exports = {
51
53
  cache,
@@ -57,6 +59,7 @@ var url = __toESM(require("./url-utils"));
57
59
  prompt,
58
60
  records,
59
61
  require,
62
+ tunnel,
60
63
  url
61
64
  });
62
65
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/index.ts"],
4
- "sourcesContent": ["export * as esbuild from './esbuild-utils'\nexport * as path from './path-utils'\nexport * as require from './require-utils'\nexport * as filewatcher from './file-watcher'\nexport * as emitter from './event-emitter'\nexport * as cache from './cache-utils'\nexport * as casing from './case-utils'\nexport * as prompt from './prompt-utils'\nexport * as records from './record-utils'\nexport * as url from './url-utils'\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA,cAAyB;AACzB,WAAsB;AACtB,IAAAA,WAAyB;AACzB,kBAA6B;AAC7B,cAAyB;AACzB,YAAuB;AACvB,aAAwB;AACxB,aAAwB;AACxB,cAAyB;AACzB,UAAqB;",
4
+ "sourcesContent": ["export * as esbuild from './esbuild-utils'\nexport * as path from './path-utils'\nexport * as require from './require-utils'\nexport * as filewatcher from './file-watcher'\nexport * as emitter from './event-emitter'\nexport * as cache from './cache-utils'\nexport * as casing from './case-utils'\nexport * as prompt from './prompt-utils'\nexport * as records from './record-utils'\nexport * as url from './url-utils'\nexport * as tunnel from './tunnel-utils'\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,cAAyB;AACzB,WAAsB;AACtB,IAAAA,WAAyB;AACzB,kBAA6B;AAC7B,cAAyB;AACzB,YAAuB;AACvB,aAAwB;AACxB,aAAwB;AACxB,cAAyB;AACzB,UAAqB;AACrB,aAAwB;",
6
6
  "names": ["require"]
7
7
  }
@@ -0,0 +1,31 @@
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 __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
18
+ mod
19
+ ));
20
+ var import_vitest = require("vitest");
21
+ var requireUtils = __toESM(require("./require-utils"));
22
+ (0, import_vitest.test)("require js code should do as its name suggests", () => {
23
+ const code = `
24
+ module.exports = {
25
+ foo: 'bar'
26
+ }
27
+ `;
28
+ const result = requireUtils.requireJsCode(code);
29
+ (0, import_vitest.expect)(result.foo).toBe("bar");
30
+ });
31
+ //# sourceMappingURL=require-utils.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/require-utils.test.ts"],
4
+ "sourcesContent": ["import { test, expect } from 'vitest'\nimport * as requireUtils from './require-utils'\n\ntest('require js code should do as its name suggests', () => {\n const code = `\n module.exports = {\n foo: 'bar'\n }\n `\n\n const result = requireUtils.requireJsCode<{ foo: string }>(code)\n\n expect(result.foo).toBe('bar')\n})\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;AAAA,oBAA6B;AAC7B,mBAA8B;AAAA,IAE9B,oBAAK,kDAAkD,MAAM;AAC3D,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAMb,QAAM,SAAS,aAAa,cAA+B,IAAI;AAE/D,4BAAO,OAAO,GAAG,EAAE,KAAK,KAAK;AAC/B,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,126 @@
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 tunnel_utils_exports = {};
20
+ __export(tunnel_utils_exports, {
21
+ ReconnectionFailedError: () => ReconnectionFailedError,
22
+ TunnelSupervisor: () => TunnelSupervisor
23
+ });
24
+ module.exports = __toCommonJS(tunnel_utils_exports);
25
+ var import_tunnel = require("@bpinternal/tunnel");
26
+ var import_event_emitter = require("./event-emitter");
27
+ class ReconnectionFailedError extends Error {
28
+ constructor(event) {
29
+ const reason = ReconnectionFailedError._reason(event);
30
+ super(`Reconnection failed: ${reason}`);
31
+ this.event = event;
32
+ }
33
+ static _reason(event) {
34
+ if (event.type === "error") {
35
+ return "error";
36
+ }
37
+ if (event.type === "close") {
38
+ return `${event.ev.code} ${event.ev.reason}`;
39
+ }
40
+ return "init";
41
+ }
42
+ }
43
+ class TunnelSupervisor {
44
+ constructor(_tunnelUrl, _tunnelId, _logger) {
45
+ this._tunnelUrl = _tunnelUrl;
46
+ this._tunnelId = _tunnelId;
47
+ this._logger = _logger;
48
+ }
49
+ _tunnel;
50
+ _closed = false;
51
+ _started = false;
52
+ events = new import_event_emitter.EventEmitter();
53
+ async start() {
54
+ if (this._closed) {
55
+ throw new Error("Tunnel is closed");
56
+ }
57
+ if (this._started) {
58
+ throw new Error("Tunnel is already started");
59
+ }
60
+ this._started = true;
61
+ const tunnel = await this._reconnect({ type: "init", ev: null });
62
+ this._tunnel = tunnel;
63
+ }
64
+ get closed() {
65
+ return this._closed;
66
+ }
67
+ async wait() {
68
+ if (this._closed) {
69
+ throw new Error("Tunnel is closed");
70
+ }
71
+ return new Promise((resolve, reject) => {
72
+ this.events.on("connectionFailed", (ev) => {
73
+ reject(new ReconnectionFailedError(ev));
74
+ });
75
+ this.events.on("manuallyClosed", () => {
76
+ resolve();
77
+ });
78
+ });
79
+ }
80
+ close() {
81
+ if (this._closed) {
82
+ return;
83
+ }
84
+ this._closed = true;
85
+ this._tunnel?.close();
86
+ this.events.emit("manuallyClosed", null);
87
+ }
88
+ _reconnectSync(ev) {
89
+ void this._reconnect(ev).then((t) => {
90
+ this._tunnel = t;
91
+ }).catch(() => this.events.emit("connectionFailed", ev));
92
+ }
93
+ async _reconnect(ev) {
94
+ const newTunnel = async () => {
95
+ const tunnel2 = await import_tunnel.TunnelTail.new(this._tunnelUrl, this._tunnelId);
96
+ this._registerListeners(tunnel2);
97
+ this.events.emit("connected", { tunnel: tunnel2, ev });
98
+ return tunnel2;
99
+ };
100
+ if (ev.type === "init") {
101
+ return newTunnel();
102
+ }
103
+ const line = this._logger.line();
104
+ line.started("Reconnecting tunnel...");
105
+ const tunnel = await newTunnel();
106
+ line.success("Reconnected");
107
+ line.commit();
108
+ return tunnel;
109
+ }
110
+ _registerListeners(tunnel) {
111
+ tunnel.events.on("error", ({ target, type }) => {
112
+ this._logger.error(`Tunnel error: ${type}`);
113
+ this._reconnectSync({ type: "error", ev: { target, type } });
114
+ });
115
+ tunnel.events.on("close", ({ code, reason, target, type, wasClean }) => {
116
+ this._logger.error(`Tunnel closed: ${code} ${reason}`);
117
+ this._reconnectSync({ type: "close", ev: { code, reason, target, type, wasClean } });
118
+ });
119
+ }
120
+ }
121
+ // Annotate the CommonJS export names for ESM import in node:
122
+ 0 && (module.exports = {
123
+ ReconnectionFailedError,
124
+ TunnelSupervisor
125
+ });
126
+ //# sourceMappingURL=tunnel-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/tunnel-utils.ts"],
4
+ "sourcesContent": ["import { TunnelTail, ClientCloseEvent, ClientErrorEvent } from '@bpinternal/tunnel'\nimport { Logger } from '../logger'\nimport { EventEmitter } from './event-emitter'\n\nexport type ReconnectionTriggerEvent =\n | {\n type: 'init'\n ev: null\n }\n | {\n type: 'error'\n ev: ClientErrorEvent\n }\n | {\n type: 'close'\n ev: ClientCloseEvent\n }\n\nexport type ReconnectedEvent = {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n}\n\nexport class ReconnectionFailedError extends Error {\n public constructor(public readonly event: ReconnectionTriggerEvent) {\n const reason = ReconnectionFailedError._reason(event)\n super(`Reconnection failed: ${reason}`)\n }\n\n private static _reason(event: ReconnectionTriggerEvent): string {\n if (event.type === 'error') {\n return 'error'\n }\n\n if (event.type === 'close') {\n return `${event.ev.code} ${event.ev.reason}`\n }\n\n return 'init'\n }\n}\n\nexport class TunnelSupervisor {\n private _tunnel?: TunnelTail\n private _closed = false\n private _started = false\n\n public readonly events = new EventEmitter<{\n connectionFailed: ReconnectionTriggerEvent\n manuallyClosed: null\n connected: {\n tunnel: TunnelTail\n ev: ReconnectionTriggerEvent\n }\n }>()\n\n constructor(private _tunnelUrl: string, private _tunnelId: string, private _logger: Logger) {}\n\n public async start(): Promise<void> {\n if (this._closed) {\n throw new Error('Tunnel is closed')\n }\n if (this._started) {\n throw new Error('Tunnel is already started')\n }\n\n this._started = true\n const tunnel = await this._reconnect({ type: 'init', ev: null })\n this._tunnel = tunnel\n }\n\n public get closed(): boolean {\n return this._closed\n }\n\n /**\n * @returns Promise that rejects when a reconnection attempt fails and resolves when the tunnel is closed manually\n */\n public async wait(): Promise<void> {\n if (this._closed) {\n throw new Error('Tunnel is closed')\n }\n\n return new Promise((resolve, reject) => {\n this.events.on('connectionFailed', (ev) => {\n reject(new ReconnectionFailedError(ev))\n })\n\n this.events.on('manuallyClosed', () => {\n resolve()\n })\n })\n }\n\n public close(): void {\n if (this._closed) {\n return\n }\n\n this._closed = true\n this._tunnel?.close()\n this.events.emit('manuallyClosed', null)\n }\n\n private _reconnectSync(ev: ReconnectionTriggerEvent): void {\n void this._reconnect(ev)\n .then((t) => {\n this._tunnel = t\n })\n .catch(() => this.events.emit('connectionFailed', ev))\n }\n\n private async _reconnect(ev: ReconnectionTriggerEvent): Promise<TunnelTail> {\n const newTunnel = async () => {\n const tunnel = await TunnelTail.new(this._tunnelUrl, this._tunnelId)\n this._registerListeners(tunnel)\n this.events.emit('connected', { tunnel, ev })\n return tunnel\n }\n\n if (ev.type === 'init') {\n // skip logging on the first connection attempt\n return newTunnel()\n }\n\n const line = this._logger.line()\n line.started('Reconnecting tunnel...')\n const tunnel = await newTunnel()\n line.success('Reconnected')\n line.commit()\n return tunnel\n }\n\n private _registerListeners(tunnel: TunnelTail) {\n tunnel.events.on('error', ({ target, type }) => {\n this._logger.error(`Tunnel error: ${type}`)\n this._reconnectSync({ type: 'error', ev: { target, type } })\n })\n tunnel.events.on('close', ({ code, reason, target, type, wasClean }) => {\n this._logger.error(`Tunnel closed: ${code} ${reason}`)\n this._reconnectSync({ type: 'close', ev: { code, reason, target, type, wasClean } })\n })\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+D;AAE/D,2BAA6B;AAqBtB,MAAM,gCAAgC,MAAM;AAAA,EAC1C,YAA4B,OAAiC;AAClE,UAAM,SAAS,wBAAwB,QAAQ,KAAK;AACpD,UAAM,wBAAwB,QAAQ;AAFL;AAAA,EAGnC;AAAA,EAEA,OAAe,QAAQ,OAAyC;AAC9D,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,aAAO,GAAG,MAAM,GAAG,QAAQ,MAAM,GAAG;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,iBAAiB;AAAA,EAc5B,YAAoB,YAA4B,WAA2B,SAAiB;AAAxE;AAA4B;AAA2B;AAAA,EAAkB;AAAA,EAbrF;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,EAEH,SAAS,IAAI,kCAO1B;AAAA,EAIH,MAAa,QAAuB;AAClC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,SAAK,WAAW;AAChB,UAAM,SAAS,MAAM,KAAK,WAAW,EAAE,MAAM,QAAQ,IAAI,KAAK,CAAC;AAC/D,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,IAAW,SAAkB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAKA,MAAa,OAAsB;AACjC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,OAAO,GAAG,oBAAoB,CAAC,OAAO;AACzC,eAAO,IAAI,wBAAwB,EAAE,CAAC;AAAA,MACxC,CAAC;AAED,WAAK,OAAO,GAAG,kBAAkB,MAAM;AACrC,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,QAAc;AACnB,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,SAAS,MAAM;AACpB,SAAK,OAAO,KAAK,kBAAkB,IAAI;AAAA,EACzC;AAAA,EAEQ,eAAe,IAAoC;AACzD,SAAK,KAAK,WAAW,EAAE,EACpB,KAAK,CAAC,MAAM;AACX,WAAK,UAAU;AAAA,IACjB,CAAC,EACA,MAAM,MAAM,KAAK,OAAO,KAAK,oBAAoB,EAAE,CAAC;AAAA,EACzD;AAAA,EAEA,MAAc,WAAW,IAAmD;AAC1E,UAAM,YAAY,YAAY;AAC5B,YAAMA,UAAS,MAAM,yBAAW,IAAI,KAAK,YAAY,KAAK,SAAS;AACnE,WAAK,mBAAmBA,OAAM;AAC9B,WAAK,OAAO,KAAK,aAAa,EAAE,QAAAA,SAAQ,GAAG,CAAC;AAC5C,aAAOA;AAAA,IACT;AAEA,QAAI,GAAG,SAAS,QAAQ;AAEtB,aAAO,UAAU;AAAA,IACnB;AAEA,UAAM,OAAO,KAAK,QAAQ,KAAK;AAC/B,SAAK,QAAQ,wBAAwB;AACrC,UAAM,SAAS,MAAM,UAAU;AAC/B,SAAK,QAAQ,aAAa;AAC1B,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,QAAoB;AAC7C,WAAO,OAAO,GAAG,SAAS,CAAC,EAAE,QAAQ,KAAK,MAAM;AAC9C,WAAK,QAAQ,MAAM,iBAAiB,MAAM;AAC1C,WAAK,eAAe,EAAE,MAAM,SAAS,IAAI,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,IAC7D,CAAC;AACD,WAAO,OAAO,GAAG,SAAS,CAAC,EAAE,MAAM,QAAQ,QAAQ,MAAM,SAAS,MAAM;AACtE,WAAK,QAAQ,MAAM,kBAAkB,QAAQ,QAAQ;AACrD,WAAK,eAAe,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,QAAQ,QAAQ,MAAM,SAAS,EAAE,CAAC;AAAA,IACrF,CAAC;AAAA,EACH;AACF;",
6
+ "names": ["tunnel"]
7
+ }
@@ -31,6 +31,9 @@ var childProcess = __toESM(require("child_process"));
31
31
  var import_child_entrypoint = require("./child-entrypoint");
32
32
  var import_config = require("./config");
33
33
  var import_is_child = require("./is-child");
34
+ const SPAWN_SHELL_ENV = {
35
+ FORCE_COLOR: "true"
36
+ };
34
37
  const listenForChildSpawn = (child, logger) => new Promise((resolve, reject) => {
35
38
  child.on("spawn", () => {
36
39
  logger.debug(`Child process spawned with pid ${child.pid}`);
@@ -72,6 +75,7 @@ class ChildProcessWrapper {
72
75
  const child = childProcess.fork(import_child_entrypoint.ENTRY_POINT, [], {
73
76
  stdio: "inherit",
74
77
  env: {
78
+ ...SPAWN_SHELL_ENV,
75
79
  [import_is_child.CHILD_ENV_KEY]: import_is_child.CHILD_ENV_VALUE,
76
80
  [import_config.CONFIG_ENV_KEY]: JSON.stringify(config),
77
81
  ...config.env
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/worker/child-wrapper.ts"],
4
- "sourcesContent": ["import * as childProcess from 'child_process'\nimport type { Logger } from '../logger'\nimport { ENTRY_POINT } from './child-entrypoint'\nimport { CONFIG_ENV_KEY, Config } from './config'\nimport { CHILD_ENV_KEY, CHILD_ENV_VALUE, isChildProcess } from './is-child'\n\nexport type ChildOutput = {\n exitCode: number | null\n signal: NodeJS.Signals | null\n}\n\nconst listenForChildSpawn = (child: childProcess.ChildProcess, logger: Logger) =>\n new Promise<void>((resolve, reject) => {\n child.on('spawn', () => {\n logger.debug(`Child process spawned with pid ${child.pid}`)\n resolve()\n })\n child.on('error', (err: Error) => {\n /**\n * The 'error' event is emitted whenever:\n * - The process could not be spawned.\n * - The child process was aborted via the signal option.\n */\n logger.debug(`Child process error: ${err.message}`)\n reject(err)\n })\n })\n\nconst listenForChildExit = (child: childProcess.ChildProcess, logger: Logger) =>\n new Promise<ChildOutput>((resolve, reject) => {\n child.on('disconnect', () => {\n logger.debug('Child process disconnected')\n })\n child.on('close', (exitCode: number | null, signal: NodeJS.Signals | null) => {\n /**\n * this event usually fires after exit unless stdio streams are shared across multiple processes.\n * see https://stackoverflow.com/questions/37522010/difference-between-childprocess-close-exit-events\n */\n logger.debug(`Child process closed with code ${exitCode} and signal ${signal}`)\n })\n child.on('exit', (exitCode: number | null, signal: NodeJS.Signals | null) => {\n logger.debug(`Child process exited with code ${exitCode} and signal ${signal}`)\n resolve({ exitCode, signal })\n })\n child.on('error', (err: Error) => {\n /**\n * The 'error' event is emitted whenever:\n * - The process could not be killed.\n * - The child process was aborted via the signal option.\n */\n logger.debug(`Child process error: ${err.message}`)\n reject(err)\n })\n child.on('message', (message) => {\n logger.debug(`Child process message: ${message}`)\n })\n })\n\n/**\n * Wrapper above child_process.ChildProcess to simplify usage\n */\nexport class ChildProcessWrapper {\n public static async spawn(config: Config, logger: Logger): Promise<ChildProcessWrapper> {\n if (isChildProcess) {\n throw new Error('Cannot spawn child process from child process')\n }\n\n const child = childProcess.fork(ENTRY_POINT, [], {\n stdio: 'inherit',\n env: {\n [CHILD_ENV_KEY]: CHILD_ENV_VALUE,\n [CONFIG_ENV_KEY]: JSON.stringify(config),\n ...config.env,\n },\n })\n\n const childSpawnPromise = listenForChildSpawn(child, logger)\n const childExitPromise = listenForChildExit(child, logger)\n\n const instance = new ChildProcessWrapper(child, childExitPromise)\n\n childExitPromise.finally(() => {\n instance._exited = true\n })\n\n await childSpawnPromise\n\n return instance\n }\n\n private _exited = false\n private constructor(private _child: childProcess.ChildProcess, private _exitPromise: Promise<ChildOutput>) {}\n\n public async kill(): Promise<ChildOutput> {\n if (this._exited) {\n throw new Error('Child process already exited and cannot be killed')\n }\n this._child.kill()\n const res = await this._exitPromise\n return res\n }\n\n public async listen(): Promise<ChildOutput> {\n if (this._exited) {\n throw new Error('Child process already exited and cannot be listened on')\n }\n const res = await this._exitPromise\n return res\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAE9B,8BAA4B;AAC5B,oBAAuC;AACvC,sBAA+D;AAO/D,MAAM,sBAAsB,CAAC,OAAkC,WAC7D,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,QAAM,GAAG,SAAS,MAAM;AACtB,WAAO,MAAM,kCAAkC,MAAM,KAAK;AAC1D,YAAQ;AAAA,EACV,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,SAAS;AAClD,WAAO,GAAG;AAAA,EACZ,CAAC;AACH,CAAC;AAEH,MAAM,qBAAqB,CAAC,OAAkC,WAC5D,IAAI,QAAqB,CAAC,SAAS,WAAW;AAC5C,QAAM,GAAG,cAAc,MAAM;AAC3B,WAAO,MAAM,4BAA4B;AAAA,EAC3C,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,UAAyB,WAAkC;AAK5E,WAAO,MAAM,kCAAkC,uBAAuB,QAAQ;AAAA,EAChF,CAAC;AACD,QAAM,GAAG,QAAQ,CAAC,UAAyB,WAAkC;AAC3E,WAAO,MAAM,kCAAkC,uBAAuB,QAAQ;AAC9E,YAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,EAC9B,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,SAAS;AAClD,WAAO,GAAG;AAAA,EACZ,CAAC;AACD,QAAM,GAAG,WAAW,CAAC,YAAY;AAC/B,WAAO,MAAM,0BAA0B,SAAS;AAAA,EAClD,CAAC;AACH,CAAC;AAKI,MAAM,oBAAoB;AAAA,EA8BvB,YAAoB,QAA2C,cAAoC;AAA/E;AAA2C;AAAA,EAAqC;AAAA,EA7B5G,aAAoB,MAAM,QAAgB,QAA8C;AACtF,QAAI,gCAAgB;AAClB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,UAAM,QAAQ,aAAa,KAAK,qCAAa,CAAC,GAAG;AAAA,MAC/C,OAAO;AAAA,MACP,KAAK;AAAA,QACH,CAAC,gCAAgB;AAAA,QACjB,CAAC,+BAAiB,KAAK,UAAU,MAAM;AAAA,QACvC,GAAG,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AAED,UAAM,oBAAoB,oBAAoB,OAAO,MAAM;AAC3D,UAAM,mBAAmB,mBAAmB,OAAO,MAAM;AAEzD,UAAM,WAAW,IAAI,oBAAoB,OAAO,gBAAgB;AAEhE,qBAAiB,QAAQ,MAAM;AAC7B,eAAS,UAAU;AAAA,IACrB,CAAC;AAED,UAAM;AAEN,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU;AAAA,EAGlB,MAAa,OAA6B;AACxC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,SAAK,OAAO,KAAK;AACjB,UAAM,MAAM,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAA+B;AAC1C,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AACA,UAAM,MAAM,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["import * as childProcess from 'child_process'\nimport type { Logger } from '../logger'\nimport { ENTRY_POINT } from './child-entrypoint'\nimport { CONFIG_ENV_KEY, Config } from './config'\nimport { CHILD_ENV_KEY, CHILD_ENV_VALUE, isChildProcess } from './is-child'\n\nexport type ChildOutput = {\n exitCode: number | null\n signal: NodeJS.Signals | null\n}\n\nconst SPAWN_SHELL_ENV: Record<string, string> = {\n FORCE_COLOR: 'true', // well-known env var used by most shells to enable color output in child processes\n} as const\n\nconst listenForChildSpawn = (child: childProcess.ChildProcess, logger: Logger) =>\n new Promise<void>((resolve, reject) => {\n child.on('spawn', () => {\n logger.debug(`Child process spawned with pid ${child.pid}`)\n resolve()\n })\n child.on('error', (err: Error) => {\n /**\n * The 'error' event is emitted whenever:\n * - The process could not be spawned.\n * - The child process was aborted via the signal option.\n */\n logger.debug(`Child process error: ${err.message}`)\n reject(err)\n })\n })\n\nconst listenForChildExit = (child: childProcess.ChildProcess, logger: Logger) =>\n new Promise<ChildOutput>((resolve, reject) => {\n child.on('disconnect', () => {\n logger.debug('Child process disconnected')\n })\n child.on('close', (exitCode: number | null, signal: NodeJS.Signals | null) => {\n /**\n * this event usually fires after exit unless stdio streams are shared across multiple processes.\n * see https://stackoverflow.com/questions/37522010/difference-between-childprocess-close-exit-events\n */\n logger.debug(`Child process closed with code ${exitCode} and signal ${signal}`)\n })\n child.on('exit', (exitCode: number | null, signal: NodeJS.Signals | null) => {\n logger.debug(`Child process exited with code ${exitCode} and signal ${signal}`)\n resolve({ exitCode, signal })\n })\n child.on('error', (err: Error) => {\n /**\n * The 'error' event is emitted whenever:\n * - The process could not be killed.\n * - The child process was aborted via the signal option.\n */\n logger.debug(`Child process error: ${err.message}`)\n reject(err)\n })\n child.on('message', (message) => {\n logger.debug(`Child process message: ${message}`)\n })\n })\n\n/**\n * Wrapper above child_process.ChildProcess to simplify usage\n */\nexport class ChildProcessWrapper {\n public static async spawn(config: Config, logger: Logger): Promise<ChildProcessWrapper> {\n if (isChildProcess) {\n throw new Error('Cannot spawn child process from child process')\n }\n\n const child = childProcess.fork(ENTRY_POINT, [], {\n stdio: 'inherit',\n env: {\n ...SPAWN_SHELL_ENV,\n [CHILD_ENV_KEY]: CHILD_ENV_VALUE,\n [CONFIG_ENV_KEY]: JSON.stringify(config),\n ...config.env,\n },\n })\n\n const childSpawnPromise = listenForChildSpawn(child, logger)\n const childExitPromise = listenForChildExit(child, logger)\n\n const instance = new ChildProcessWrapper(child, childExitPromise)\n\n childExitPromise.finally(() => {\n instance._exited = true\n })\n\n await childSpawnPromise\n\n return instance\n }\n\n private _exited = false\n private constructor(private _child: childProcess.ChildProcess, private _exitPromise: Promise<ChildOutput>) {}\n\n public async kill(): Promise<ChildOutput> {\n if (this._exited) {\n throw new Error('Child process already exited and cannot be killed')\n }\n this._child.kill()\n const res = await this._exitPromise\n return res\n }\n\n public async listen(): Promise<ChildOutput> {\n if (this._exited) {\n throw new Error('Child process already exited and cannot be listened on')\n }\n const res = await this._exitPromise\n return res\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAE9B,8BAA4B;AAC5B,oBAAuC;AACvC,sBAA+D;AAO/D,MAAM,kBAA0C;AAAA,EAC9C,aAAa;AACf;AAEA,MAAM,sBAAsB,CAAC,OAAkC,WAC7D,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,QAAM,GAAG,SAAS,MAAM;AACtB,WAAO,MAAM,kCAAkC,MAAM,KAAK;AAC1D,YAAQ;AAAA,EACV,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,SAAS;AAClD,WAAO,GAAG;AAAA,EACZ,CAAC;AACH,CAAC;AAEH,MAAM,qBAAqB,CAAC,OAAkC,WAC5D,IAAI,QAAqB,CAAC,SAAS,WAAW;AAC5C,QAAM,GAAG,cAAc,MAAM;AAC3B,WAAO,MAAM,4BAA4B;AAAA,EAC3C,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,UAAyB,WAAkC;AAK5E,WAAO,MAAM,kCAAkC,uBAAuB,QAAQ;AAAA,EAChF,CAAC;AACD,QAAM,GAAG,QAAQ,CAAC,UAAyB,WAAkC;AAC3E,WAAO,MAAM,kCAAkC,uBAAuB,QAAQ;AAC9E,YAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,EAC9B,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,SAAS;AAClD,WAAO,GAAG;AAAA,EACZ,CAAC;AACD,QAAM,GAAG,WAAW,CAAC,YAAY;AAC/B,WAAO,MAAM,0BAA0B,SAAS;AAAA,EAClD,CAAC;AACH,CAAC;AAKI,MAAM,oBAAoB;AAAA,EA+BvB,YAAoB,QAA2C,cAAoC;AAA/E;AAA2C;AAAA,EAAqC;AAAA,EA9B5G,aAAoB,MAAM,QAAgB,QAA8C;AACtF,QAAI,gCAAgB;AAClB,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAEA,UAAM,QAAQ,aAAa,KAAK,qCAAa,CAAC,GAAG;AAAA,MAC/C,OAAO;AAAA,MACP,KAAK;AAAA,QACH,GAAG;AAAA,QACH,CAAC,gCAAgB;AAAA,QACjB,CAAC,+BAAiB,KAAK,UAAU,MAAM;AAAA,QACvC,GAAG,OAAO;AAAA,MACZ;AAAA,IACF,CAAC;AAED,UAAM,oBAAoB,oBAAoB,OAAO,MAAM;AAC3D,UAAM,mBAAmB,mBAAmB,OAAO,MAAM;AAEzD,UAAM,WAAW,IAAI,oBAAoB,OAAO,gBAAgB;AAEhE,qBAAiB,QAAQ,MAAM;AAC7B,eAAS,UAAU;AAAA,IACrB,CAAC;AAED,UAAM;AAEN,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU;AAAA,EAGlB,MAAa,OAA6B;AACxC,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AACA,SAAK,OAAO,KAAK;AACjB,UAAM,MAAM,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAA+B;AAC1C,QAAI,KAAK,SAAS;AAChB,YAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AACA,UAAM,MAAM,MAAM,KAAK;AACvB,WAAO;AAAA,EACT;AACF;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "main": "dist/index.js",
20
20
  "dependencies": {
21
- "@botpress/client": "0.1.1",
21
+ "@botpress/client": "0.1.3",
22
22
  "@bpinternal/tunnel": "^0.0.2",
23
23
  "@bpinternal/yargs-extra": "^0.0.3",
24
24
  "@parcel/watcher": "^2.1.0",
@@ -45,7 +45,7 @@
45
45
  "zod-to-json-schema": "^3.20.1"
46
46
  },
47
47
  "devDependencies": {
48
- "@botpress/sdk": "0.1.3",
48
+ "@botpress/sdk": "0.1.5",
49
49
  "@types/bluebird": "^3.5.38",
50
50
  "@types/prompts": "^2.0.14",
51
51
  "@types/semver": "^7.3.11",
@@ -8,14 +8,13 @@
8
8
  "author": "",
9
9
  "license": "MIT",
10
10
  "dependencies": {
11
- "@botpress/client": "0.1.1",
12
- "@botpress/sdk": "0.1.3",
11
+ "@botpress/client": "0.1.3",
12
+ "@botpress/sdk": "0.1.5",
13
13
  "zod": "^3.20.6"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@types/node": "^18.11.17",
17
17
  "ts-node": "^10.9.1",
18
- "typescript": "^4.9.4",
19
- "@tsconfig/node18-strictest": "^1.0.0"
18
+ "typescript": "^4.9.4"
20
19
  }
21
20
  }
@@ -1,6 +1,19 @@
1
1
  {
2
- "extends": "@tsconfig/node18-strictest/tsconfig.json",
3
2
  "compilerOptions": {
3
+ "lib": ["es2022"],
4
+ "module": "commonjs",
5
+ "strict": true,
6
+ "esModuleInterop": true,
7
+ "skipLibCheck": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "moduleResolution": "node",
10
+ "allowUnusedLabels": false,
11
+ "allowUnreachableCode": false,
12
+ "noFallthroughCasesInSwitch": true,
13
+ "noImplicitOverride": true,
14
+ "noImplicitReturns": true,
15
+ "noUncheckedIndexedAccess": true,
16
+ "noUnusedParameters": true,
4
17
  "target": "es2017",
5
18
  "baseUrl": ".",
6
19
  "outDir": "dist",
@@ -8,14 +8,13 @@
8
8
  "author": "",
9
9
  "license": "MIT",
10
10
  "dependencies": {
11
- "@botpress/client": "0.1.1",
12
- "@botpress/sdk": "0.1.3",
11
+ "@botpress/client": "0.1.3",
12
+ "@botpress/sdk": "0.1.5",
13
13
  "zod": "^3.20.6"
14
14
  },
15
15
  "devDependencies": {
16
16
  "@types/node": "^18.11.17",
17
17
  "ts-node": "^10.9.1",
18
- "typescript": "^4.9.4",
19
- "@tsconfig/node18-strictest": "^1.0.0"
18
+ "typescript": "^4.9.4"
20
19
  }
21
20
  }
@@ -1,6 +1,19 @@
1
1
  {
2
- "extends": "@tsconfig/node18-strictest/tsconfig.json",
3
2
  "compilerOptions": {
3
+ "lib": ["es2022"],
4
+ "module": "commonjs",
5
+ "strict": true,
6
+ "esModuleInterop": true,
7
+ "skipLibCheck": true,
8
+ "forceConsistentCasingInFileNames": true,
9
+ "moduleResolution": "node",
10
+ "allowUnusedLabels": false,
11
+ "allowUnreachableCode": false,
12
+ "noFallthroughCasesInSwitch": true,
13
+ "noImplicitOverride": true,
14
+ "noImplicitReturns": true,
15
+ "noUncheckedIndexedAccess": true,
16
+ "noUnusedParameters": true,
4
17
  "target": "es2017",
5
18
  "baseUrl": ".",
6
19
  "outDir": "dist",