@botpress/cli 4.17.12 → 4.17.14

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 (123) hide show
  1. package/.turbo/turbo-build.log +11 -11
  2. package/dist/api/client.js +2 -1
  3. package/dist/api/client.js.map +1 -1
  4. package/dist/api/index.js +9 -0
  5. package/dist/chat/index.js +1 -1
  6. package/dist/chat/index.js.map +1 -1
  7. package/dist/code-generation/bot-implementation/bot-implementation.js.map +1 -1
  8. package/dist/code-generation/bot-implementation/bot-plugins/index.js.map +1 -1
  9. package/dist/code-generation/bot-implementation/bot-plugins/plugin-module.js.map +1 -1
  10. package/dist/code-generation/bot-implementation/bot-typings/actions-module.js.map +1 -1
  11. package/dist/code-generation/bot-implementation/bot-typings/events-module.js.map +1 -1
  12. package/dist/code-generation/bot-implementation/bot-typings/index.js.map +1 -1
  13. package/dist/code-generation/bot-implementation/bot-typings/states-module.js.map +1 -1
  14. package/dist/code-generation/bot-implementation/bot-typings/tables-module.js.map +1 -1
  15. package/dist/code-generation/bot-implementation/bot-typings/workflows-module.js.map +1 -1
  16. package/dist/code-generation/bot-implementation/index.js.map +1 -1
  17. package/dist/code-generation/consts.js +2 -1
  18. package/dist/code-generation/generators.js.map +1 -1
  19. package/dist/code-generation/index.js +2 -1
  20. package/dist/code-generation/integration-implementation/index.js.map +1 -1
  21. package/dist/code-generation/integration-implementation/integration-implementation.js.map +1 -1
  22. package/dist/code-generation/integration-implementation/integration-secret.js.map +1 -1
  23. package/dist/code-generation/integration-implementation/integration-typings/actions-module.js.map +1 -1
  24. package/dist/code-generation/integration-implementation/integration-typings/channels-module.js.map +1 -1
  25. package/dist/code-generation/integration-implementation/integration-typings/configurations-module.js.map +1 -1
  26. package/dist/code-generation/integration-implementation/integration-typings/entities-module.js.map +1 -1
  27. package/dist/code-generation/integration-implementation/integration-typings/events-module.js.map +1 -1
  28. package/dist/code-generation/integration-implementation/integration-typings/index.js.map +1 -1
  29. package/dist/code-generation/integration-implementation/integration-typings/states-module.js.map +1 -1
  30. package/dist/code-generation/integration-package/index.js.map +1 -1
  31. package/dist/code-generation/integration-package/integration-package-definition/actions-module.js.map +1 -1
  32. package/dist/code-generation/integration-package/integration-package-definition/channels-module.js.map +1 -1
  33. package/dist/code-generation/integration-package/integration-package-definition/configurations-module.js.map +1 -1
  34. package/dist/code-generation/integration-package/integration-package-definition/entities-module.js.map +1 -1
  35. package/dist/code-generation/integration-package/integration-package-definition/events-module.js.map +1 -1
  36. package/dist/code-generation/integration-package/integration-package-definition/index.js.map +1 -1
  37. package/dist/code-generation/integration-package/integration-package-definition/interfaces-module.js.map +1 -1
  38. package/dist/code-generation/integration-package/integration-package-definition/states-module.js.map +1 -1
  39. package/dist/code-generation/interface-implementation/integration-typings/actions-module.js.map +1 -1
  40. package/dist/code-generation/interface-implementation/integration-typings/channels-module.js.map +1 -1
  41. package/dist/code-generation/interface-implementation/integration-typings/entities-module.js.map +1 -1
  42. package/dist/code-generation/interface-implementation/integration-typings/events-module.js.map +1 -1
  43. package/dist/code-generation/interface-implementation/integration-typings/index.js.map +1 -1
  44. package/dist/code-generation/interface-package/index.js.map +1 -1
  45. package/dist/code-generation/interface-package/interface-package-definition/actions-module.js.map +1 -1
  46. package/dist/code-generation/interface-package/interface-package-definition/channels-module.js.map +1 -1
  47. package/dist/code-generation/interface-package/interface-package-definition/entities-module.js.map +1 -1
  48. package/dist/code-generation/interface-package/interface-package-definition/events-module.js.map +1 -1
  49. package/dist/code-generation/interface-package/interface-package-definition/index.js.map +1 -1
  50. package/dist/code-generation/module.js +2 -2
  51. package/dist/code-generation/module.js.map +2 -2
  52. package/dist/code-generation/plugin-implementation/index.js.map +1 -1
  53. package/dist/code-generation/plugin-implementation/plugin-implementation.js.map +1 -1
  54. package/dist/code-generation/plugin-implementation/plugin-typings/actions-module.js.map +1 -1
  55. package/dist/code-generation/plugin-implementation/plugin-typings/events-module.js.map +1 -1
  56. package/dist/code-generation/plugin-implementation/plugin-typings/index.js.map +1 -1
  57. package/dist/code-generation/plugin-implementation/plugin-typings/states-module.js.map +1 -1
  58. package/dist/code-generation/plugin-implementation/plugin-typings/tables-module.js.map +1 -1
  59. package/dist/code-generation/plugin-implementation/plugin-typings/workflows-module.js.map +1 -1
  60. package/dist/code-generation/plugin-package/index.js.map +1 -1
  61. package/dist/code-generation/plugin-package/plugin-package-definition/actions-module.js.map +1 -1
  62. package/dist/code-generation/plugin-package/plugin-package-definition/events-module.js.map +1 -1
  63. package/dist/code-generation/plugin-package/plugin-package-definition/index.js.map +1 -1
  64. package/dist/code-generation/plugin-package/plugin-package-definition/interfaces-module.js.map +1 -1
  65. package/dist/code-generation/plugin-package/plugin-package-definition/recurring-events-module.js.map +1 -1
  66. package/dist/code-generation/plugin-package/plugin-package-definition/states-module.js.map +1 -1
  67. package/dist/code-generation/strings.js.map +1 -1
  68. package/dist/command-definitions.js +0 -2
  69. package/dist/command-implementations/add-command.js.map +1 -1
  70. package/dist/command-implementations/base-command.js.map +1 -1
  71. package/dist/command-implementations/bot-commands.js.map +1 -1
  72. package/dist/command-implementations/build-command.js +4 -4
  73. package/dist/command-implementations/build-command.js.map +2 -2
  74. package/dist/command-implementations/bundle-command.js +8 -7
  75. package/dist/command-implementations/bundle-command.js.map +2 -2
  76. package/dist/command-implementations/chat-command.js.map +1 -1
  77. package/dist/command-implementations/deploy-command.js +1 -2
  78. package/dist/command-implementations/deploy-command.js.map +1 -1
  79. package/dist/command-implementations/dev-command.js +19 -3
  80. package/dist/command-implementations/dev-command.js.map +2 -2
  81. package/dist/command-implementations/gen-command.js.map +1 -1
  82. package/dist/command-implementations/global-command.js.map +1 -1
  83. package/dist/command-implementations/index.js +0 -2
  84. package/dist/command-implementations/init-command.js.map +1 -1
  85. package/dist/command-implementations/integration-commands.js.map +1 -1
  86. package/dist/command-implementations/interface-commands.js.map +1 -1
  87. package/dist/command-implementations/login-command.js +1 -2
  88. package/dist/command-implementations/login-command.js.map +1 -1
  89. package/dist/command-implementations/plugin-commands.js.map +1 -1
  90. package/dist/command-implementations/profile-commands.js +1 -2
  91. package/dist/command-implementations/profile-commands.js.map +1 -1
  92. package/dist/command-implementations/project-command.js.map +1 -1
  93. package/dist/command-implementations/serve-command.js.map +1 -1
  94. package/dist/errors.js.map +1 -1
  95. package/dist/index.js.map +1 -1
  96. package/dist/linter/base-linter.js.map +1 -1
  97. package/dist/linter/base-linter.test.js +4 -4
  98. package/dist/linter/base-linter.test.js.map +1 -1
  99. package/dist/linter/rulesets/bot.ruleset.js.map +1 -1
  100. package/dist/linter/rulesets/integration.ruleset.js.map +1 -1
  101. package/dist/linter/rulesets/interface.ruleset.js.map +1 -1
  102. package/dist/logger/base-logger.js.map +1 -1
  103. package/dist/logger/index.js.map +1 -1
  104. package/dist/package-ref.js.map +1 -1
  105. package/dist/package-ref.test.js.map +1 -1
  106. package/dist/register-yargs.js.map +1 -1
  107. package/dist/sdk/index.js +5 -0
  108. package/dist/sdk/validate-bot.js.map +1 -1
  109. package/dist/sdk/validate-integration.js.map +1 -1
  110. package/dist/tables/tables-publisher.js.map +1 -1
  111. package/dist/utils/case-utils.test.js.map +1 -1
  112. package/dist/utils/esbuild-utils.js +32 -1
  113. package/dist/utils/esbuild-utils.js.map +3 -3
  114. package/dist/utils/file-watcher.js.map +1 -1
  115. package/dist/utils/prompt-utils.js.map +1 -1
  116. package/dist/utils/require-utils.js.map +1 -1
  117. package/dist/utils/require-utils.test.js.map +1 -1
  118. package/dist/utils/tunnel-utils.js.map +1 -1
  119. package/dist/utils/url-utils.js.map +1 -1
  120. package/dist/worker/child-entrypoint.js.map +1 -1
  121. package/dist/worker/child-wrapper.js.map +1 -1
  122. package/dist/worker/is-child.js.map +1 -1
  123. package/package.json +2 -2
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/sdk/validate-bot.ts"],
4
4
  "sourcesContent": ["import type * as sdk from '@botpress/sdk'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\n\ntype PackageRef = { name: string; version: string }\n\nconst PLUGIN_PREFIX_SEP = '#'\n\nexport const validateBotDefinition = (b: sdk.BotDefinition): void => {\n const { actions, events, states } = b\n\n const invalidActionNames = _nonCamelCaseKeys(actions ?? {})\n if (invalidActionNames.length) {\n throw new errors.BotpressCLIError(\n `The following action names are not in camelCase: ${invalidActionNames.join(', ')}`\n )\n }\n\n const invalidEventNames = _nonCamelCaseKeys(events ?? {})\n if (invalidEventNames.length) {\n throw new errors.BotpressCLIError(`The following event names are not in camelCase: ${invalidEventNames.join(', ')}`)\n }\n\n const invalidStateNames = _nonCamelCaseKeys(states ?? {})\n if (invalidStateNames.length) {\n throw new errors.BotpressCLIError(`The following state names are not in camelCase: ${invalidStateNames.join(', ')}`)\n }\n\n for (const [pluginName, plugin] of Object.entries(b.plugins ?? {})) {\n const integrationDependencies = plugin.definition.integrations ?? {}\n for (const dep of Object.values(integrationDependencies)) {\n if (!_hasIntegrationDependency(b, dep)) {\n throw new errors.BotpressCLIError(\n `Plugin \"${pluginName}\" has a dependency on integration \"${dep.name}@${dep.version}\", but it is not present in the bot definition. Please install it.`\n )\n }\n }\n\n const interfaceDependencies = plugin.definition.interfaces ?? {}\n for (const [interfaceAlias, dep] of Object.entries(interfaceDependencies)) {\n const interfaceImpl = plugin.interfaces[interfaceAlias]\n if (!interfaceImpl) {\n throw new errors.BotpressCLIError(\n `Plugin \"${pluginName}\" has a dependency on interface \"${dep.name}@${dep.version}\" (aliased as \"${interfaceAlias}\"), but the bot does not specify an implementation for it.`\n )\n }\n\n if (!_hasIntegrationDependency(b, interfaceImpl)) {\n throw new errors.BotpressCLIError(\n `Integration \"${interfaceImpl.name}@${interfaceImpl.version}\" is not installed in the bot, but specified as an implementation for interface \"${dep.name}@${dep.version}\"`\n )\n }\n }\n }\n}\n\nconst _nonCamelCaseKeys = (obj: Record<string, any>): string[] =>\n Object.keys(obj).filter((key) => {\n const tokens: string[] = key.split(PLUGIN_PREFIX_SEP, 2)\n return !utils.casing.is.camelCase(tokens.at(-1)!)\n })\n\nconst _hasIntegrationDependency = (b: sdk.BotDefinition, dep: PackageRef): boolean => {\n const integrationInstances = Object.entries(b.integrations ?? {}).map(([_k, v]) => v)\n return integrationInstances.some(\n (integration) => integration.name === dep.name && integration.version === dep.version\n )\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,aAAwB;AACxB,YAAuB;AAIvB,MAAM,oBAAoB;AAEnB,MAAM,wBAAwB,CAAC,MAA+B;AACnE,QAAM,EAAE,SAAS,QAAQ,OAAO,IAAI;AAEpC,QAAM,qBAAqB,kBAAkB,WAAW,CAAC,CAAC;AAC1D,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,IAAI,OAAO;AAAA,MACf,oDAAoD,mBAAmB,KAAK,IAAI;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,GAAG;AAAA,EACrH;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,GAAG;AAAA,EACrH;AAEA,aAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,EAAE,WAAW,CAAC,CAAC,GAAG;AAClE,UAAM,0BAA0B,OAAO,WAAW,gBAAgB,CAAC;AACnE,eAAW,OAAO,OAAO,OAAO,uBAAuB,GAAG;AACxD,UAAI,CAAC,0BAA0B,GAAG,GAAG,GAAG;AACtC,cAAM,IAAI,OAAO;AAAA,UACf,WAAW,gDAAgD,IAAI,QAAQ,IAAI;AAAA,QAC7E;AAAA,MACF;AAAA,IACF;AAEA,UAAM,wBAAwB,OAAO,WAAW,cAAc,CAAC;AAC/D,eAAW,CAAC,gBAAgB,GAAG,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACzE,YAAM,gBAAgB,OAAO,WAAW,cAAc;AACtD,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,OAAO;AAAA,UACf,WAAW,8CAA8C,IAAI,QAAQ,IAAI,yBAAyB;AAAA,QACpG;AAAA,MACF;AAEA,UAAI,CAAC,0BAA0B,GAAG,aAAa,GAAG;AAChD,cAAM,IAAI,OAAO;AAAA,UACf,gBAAgB,cAAc,QAAQ,cAAc,2FAA2F,IAAI,QAAQ,IAAI;AAAA,QACjK;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,oBAAoB,CAAC,QACzB,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,QAAQ;AAC/B,QAAM,SAAmB,IAAI,MAAM,mBAAmB,CAAC;AACvD,SAAO,CAAC,MAAM,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE,CAAE;AAClD,CAAC;AAEH,MAAM,4BAA4B,CAAC,GAAsB,QAA6B;AACpF,QAAM,uBAAuB,OAAO,QAAQ,EAAE,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACpF,SAAO,qBAAqB;AAAA,IAC1B,CAAC,gBAAgB,YAAY,SAAS,IAAI,QAAQ,YAAY,YAAY,IAAI;AAAA,EAChF;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,aAAwB;AACxB,YAAuB;AAIvB,MAAM,oBAAoB;AAEnB,MAAM,wBAAwB,CAAC,MAA+B;AACnE,QAAM,EAAE,SAAS,QAAQ,OAAO,IAAI;AAEpC,QAAM,qBAAqB,kBAAkB,WAAW,CAAC,CAAC;AAC1D,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,IAAI,OAAO;AAAA,MACf,oDAAoD,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,CAAC,EAAE;AAAA,EACrH;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,CAAC,EAAE;AAAA,EACrH;AAEA,aAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,EAAE,WAAW,CAAC,CAAC,GAAG;AAClE,UAAM,0BAA0B,OAAO,WAAW,gBAAgB,CAAC;AACnE,eAAW,OAAO,OAAO,OAAO,uBAAuB,GAAG;AACxD,UAAI,CAAC,0BAA0B,GAAG,GAAG,GAAG;AACtC,cAAM,IAAI,OAAO;AAAA,UACf,WAAW,UAAU,sCAAsC,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,QACpF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,wBAAwB,OAAO,WAAW,cAAc,CAAC;AAC/D,eAAW,CAAC,gBAAgB,GAAG,KAAK,OAAO,QAAQ,qBAAqB,GAAG;AACzE,YAAM,gBAAgB,OAAO,WAAW,cAAc;AACtD,UAAI,CAAC,eAAe;AAClB,cAAM,IAAI,OAAO;AAAA,UACf,WAAW,UAAU,oCAAoC,IAAI,IAAI,IAAI,IAAI,OAAO,kBAAkB,cAAc;AAAA,QAClH;AAAA,MACF;AAEA,UAAI,CAAC,0BAA0B,GAAG,aAAa,GAAG;AAChD,cAAM,IAAI,OAAO;AAAA,UACf,gBAAgB,cAAc,IAAI,IAAI,cAAc,OAAO,oFAAoF,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,QACxK;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,MAAM,oBAAoB,CAAC,QACzB,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,QAAQ;AAC/B,QAAM,SAAmB,IAAI,MAAM,mBAAmB,CAAC;AACvD,SAAO,CAAC,MAAM,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE,CAAE;AAClD,CAAC;AAEH,MAAM,4BAA4B,CAAC,GAAsB,QAA6B;AACpF,QAAM,uBAAuB,OAAO,QAAQ,EAAE,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AACpF,SAAO,qBAAqB;AAAA,IAC1B,CAAC,gBAAgB,YAAY,SAAS,IAAI,QAAQ,YAAY,YAAY,IAAI;AAAA,EAChF;AACF;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/sdk/validate-integration.ts"],
4
4
  "sourcesContent": ["import type * as sdk from '@botpress/sdk'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\n\nexport const validateIntegrationDefinition = (i: sdk.IntegrationDefinition): void => {\n const { actions, channels, events, states } = i\n\n const invalidActionNames = _nonCamelCaseKeys(actions ?? {})\n if (invalidActionNames.length) {\n throw new errors.BotpressCLIError(\n `The following action names are not in camelCase: ${invalidActionNames.join(', ')}`\n )\n }\n\n const invalidChannelNames = _nonCamelCaseKeys(channels ?? {})\n if (invalidChannelNames.length) {\n throw new errors.BotpressCLIError(\n `The following channel names are not in camelCase: ${invalidChannelNames.join(', ')}`\n )\n }\n\n const invalidMessageNames = Object.entries(channels ?? {}).flatMap(([channelName, channel]) =>\n _nonCamelCaseKeys(channel.messages ?? {}).map((message) => `${channelName}.${message}`)\n )\n if (invalidMessageNames.length) {\n throw new errors.BotpressCLIError(\n `The following message names are not in camelCase: ${invalidMessageNames.join(', ')}`\n )\n }\n\n const invalidEventNames = _nonCamelCaseKeys(events ?? {})\n if (invalidEventNames.length) {\n throw new errors.BotpressCLIError(`The following event names are not in camelCase: ${invalidEventNames.join(', ')}`)\n }\n\n const invalidStateNames = _nonCamelCaseKeys(states ?? {})\n if (invalidStateNames.length) {\n throw new errors.BotpressCLIError(`The following state names are not in camelCase: ${invalidStateNames.join(', ')}`)\n }\n}\n\nconst _nonCamelCaseKeys = (obj: Record<string, any>): string[] =>\n Object.keys(obj).filter((k) => !utils.casing.is.camelCase(k))\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,aAAwB;AACxB,YAAuB;AAEhB,MAAM,gCAAgC,CAAC,MAAuC;AACnF,QAAM,EAAE,SAAS,UAAU,QAAQ,OAAO,IAAI;AAE9C,QAAM,qBAAqB,kBAAkB,WAAW,CAAC,CAAC;AAC1D,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,IAAI,OAAO;AAAA,MACf,oDAAoD,mBAAmB,KAAK,IAAI;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,sBAAsB,kBAAkB,YAAY,CAAC,CAAC;AAC5D,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,IAAI,OAAO;AAAA,MACf,qDAAqD,oBAAoB,KAAK,IAAI;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,QAAQ,YAAY,CAAC,CAAC,EAAE;AAAA,IAAQ,CAAC,CAAC,aAAa,OAAO,MACvF,kBAAkB,QAAQ,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,eAAe,SAAS;AAAA,EACxF;AACA,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,IAAI,OAAO;AAAA,MACf,qDAAqD,oBAAoB,KAAK,IAAI;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,GAAG;AAAA,EACrH;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,GAAG;AAAA,EACrH;AACF;AAEA,MAAM,oBAAoB,CAAC,QACzB,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,aAAwB;AACxB,YAAuB;AAEhB,MAAM,gCAAgC,CAAC,MAAuC;AACnF,QAAM,EAAE,SAAS,UAAU,QAAQ,OAAO,IAAI;AAE9C,QAAM,qBAAqB,kBAAkB,WAAW,CAAC,CAAC;AAC1D,MAAI,mBAAmB,QAAQ;AAC7B,UAAM,IAAI,OAAO;AAAA,MACf,oDAAoD,mBAAmB,KAAK,IAAI,CAAC;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,sBAAsB,kBAAkB,YAAY,CAAC,CAAC;AAC5D,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,IAAI,OAAO;AAAA,MACf,qDAAqD,oBAAoB,KAAK,IAAI,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,sBAAsB,OAAO,QAAQ,YAAY,CAAC,CAAC,EAAE;AAAA,IAAQ,CAAC,CAAC,aAAa,OAAO,MACvF,kBAAkB,QAAQ,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,GAAG,WAAW,IAAI,OAAO,EAAE;AAAA,EACxF;AACA,MAAI,oBAAoB,QAAQ;AAC9B,UAAM,IAAI,OAAO;AAAA,MACf,qDAAqD,oBAAoB,KAAK,IAAI,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,CAAC,EAAE;AAAA,EACrH;AAEA,QAAM,oBAAoB,kBAAkB,UAAU,CAAC,CAAC;AACxD,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,IAAI,OAAO,iBAAiB,mDAAmD,kBAAkB,KAAK,IAAI,CAAC,EAAE;AAAA,EACrH;AACF;AAEA,MAAM,oBAAoB,CAAC,QACzB,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/tables/tables-publisher.ts"],
4
4
  "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport * as apiUtils from '../api'\nimport * as errors from '../errors'\nimport * as logger from '../logger'\nimport * as utils from '../utils'\nimport * as schemas from './schemas'\n\nexport class TablesPublisher {\n private readonly _api: apiUtils.ApiClient\n private readonly _logger: logger.Logger\n private readonly _prompt: utils.prompt.CLIPrompt\n\n public constructor({\n api,\n logger,\n prompt,\n }: {\n api: apiUtils.ApiClient\n logger: logger.Logger\n prompt: utils.prompt.CLIPrompt\n }) {\n this._api = api\n this._logger = logger\n this._prompt = prompt\n }\n\n public async deployTables({ botId, botDefinition }: { botId: string; botDefinition: sdk.BotDefinition }) {\n const api = this._api.switchBot(botId)\n\n this._logger.log('Synchronizing tables...')\n\n const tablesFromBotDef = Object.entries(botDefinition.tables ?? {})\n const listTableResult = await api.safeListTables({})\n\n if (!listTableResult.success) {\n this._logger.warn('Tables API is not available, skipping table deployment.')\n return\n }\n\n const { tables: existingTables } = listTableResult\n for (const [tableName, tableDef] of tablesFromBotDef) {\n const existingTable = existingTables.find((t) => t.name === tableName)\n\n this._logger.log(`Deploying table \"${tableName}\"...`)\n\n if (existingTable) {\n await this._deployExistingTable({ api, existingTable, updatedTableDef: tableDef })\n } else {\n await this._deployNewTable({ api, tableName, tableDef })\n }\n }\n\n for (const existingTable of existingTables) {\n if (!tablesFromBotDef.find(([tableName]) => tableName === existingTable.name)) {\n this._logger.log(\n `Table \"${existingTable.name}\" was previously defined but is not present in your bot definition. ` +\n 'This table will be ignored. ' +\n 'If you wish to delete this table, you may do so from the studio.'\n )\n }\n }\n }\n\n private async _deployExistingTable({\n api,\n existingTable,\n updatedTableDef,\n }: {\n api: apiUtils.ApiClient\n existingTable: Awaited<ReturnType<apiUtils.ApiClient['client']['listTables']>>['tables'][number]\n updatedTableDef: sdk.BotTableDefinition\n }) {\n if (existingTable.frozen) {\n this._logger.warn(`Table \"${existingTable.name}\" is frozen and will not be updated.`)\n return\n }\n\n const existingColumns = existingTable.schema.properties\n const updatedColumns = await this._parseTableColumns({ tableName: existingTable.name, tableDef: updatedTableDef })\n\n for (const [columnName, existingColumn] of Object.entries(existingColumns)) {\n const updatedColumn = updatedColumns[columnName]\n\n if (!updatedColumn) {\n const wishToContinue = await this._warnAndConfirm(\n `Column \"${columnName}\" is missing from the schema of table \"${existingTable.name}\" in your bot definition. ` +\n 'If you are attempting to rename this column, please do so from the studio. ' +\n 'Renaming a column in your bot definition will cause a new column to be created. ' +\n 'If this is not a rename and you wish to proceed, the old column will be kept unchanged. ' +\n 'You can delete columns from the studio if you no longer need them.'\n )\n\n // TODO: ask the user whether this is a rename. If it is a rename, list\n // all other columns and ask which one has the new name, then do\n // the rename operation with client.renameTableColumn()\n\n if (!wishToContinue) {\n return\n }\n }\n\n if (updatedColumn && existingColumn.type !== updatedColumn.type) {\n const wishToContinue = await this._warnAndConfirm(\n 'DATA LOSS WARNING: ' +\n `Type of column \"${columnName}\" has changed from \"${existingColumn.type}\" to \"${updatedColumn.type}\" in table \"${existingTable.name}\". ` +\n 'If you proceed, the value of this column will be reset to NULL for all rows in the table.'\n )\n\n if (!wishToContinue) {\n return\n }\n }\n }\n\n await api.client.updateTable({\n table: existingTable.name,\n schema: sdk.transforms.toJSONSchemaLegacy(updatedTableDef.schema),\n frozen: updatedTableDef.frozen,\n tags: updatedTableDef.tags,\n isComputeEnabled: updatedTableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${existingTable.name}\" has been updated`)\n }\n\n private async _parseTableColumns({\n tableName,\n tableDef,\n }: {\n tableName: string\n tableDef: sdk.BotTableDefinition\n }): Promise<Record<string, sdk.z.infer<typeof schemas.columnSchema>>> {\n const columns = sdk.transforms.toJSONSchemaLegacy(tableDef.schema).properties!\n\n const validColumns = await Promise.all(\n Object.entries(columns).map(async ([columnName, columnSchema]) => {\n const validatedSchema = await schemas.columnSchema.safeParseAsync(columnSchema)\n\n if (!validatedSchema.success) {\n throw new errors.BotpressCLIError(\n `Column \"${columnName}\" in table \"${tableName}\" has an invalid schema: ${validatedSchema.error.message}`\n )\n }\n\n return [columnName, validatedSchema.data] as const\n })\n )\n\n return Object.fromEntries(validColumns)\n }\n\n private async _warnAndConfirm(warningMessage: string, confirmMessage: string = 'Are you sure you want to continue?') {\n this._logger.warn(warningMessage)\n\n const confirm = await this._prompt.confirm(confirmMessage)\n\n if (!confirm) {\n this._logger.log('Aborted')\n return false\n }\n return true\n }\n\n private async _deployNewTable({\n api,\n tableName,\n tableDef,\n }: {\n api: apiUtils.ApiClient\n tableName: string\n tableDef: sdk.BotTableDefinition\n }) {\n await api.client.createTable({\n name: tableName,\n schema: sdk.transforms.toJSONSchemaLegacy(tableDef.schema),\n frozen: tableDef.frozen,\n tags: tableDef.tags,\n factor: tableDef.factor,\n isComputeEnabled: tableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${tableName}\" has been created`)\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["logger"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/case-utils.test.ts"],
4
4
  "sourcesContent": ["import { test, expect } from 'vitest'\nimport * as caseUtils from './case-utils'\n\nconst pascalCase = 'HelloLittleWorld'\nconst kebabCase = 'hello-little-world'\nconst snakeCase = 'hello_little_world'\nconst screamingSnakeCase = 'HELLO_LITTLE_WORLD'\nconst camelCase = 'helloLittleWorld'\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\ntest('case utils should split special characters when converting', () => {\n expect(caseUtils.to.pascalCase(`${pascalCase}.2`)).toBe(`${pascalCase}2`)\n expect(caseUtils.to.kebabCase(`${kebabCase}.2`)).toBe(`${kebabCase}-2`)\n expect(caseUtils.to.snakeCase(`${snakeCase}.2`)).toBe(`${snakeCase}_2`)\n expect(caseUtils.to.screamingSnakeCase(`${screamingSnakeCase}.2`)).toBe(`${screamingSnakeCase}_2`)\n expect(caseUtils.to.camelCase(`${camelCase}.2`)).toBe(`${camelCase}2`)\n})\n\ntest('case utils should prevent special characters when checking', () => {\n expect(caseUtils.is.pascalCase(`${pascalCase}.2`)).toBe(false)\n expect(caseUtils.is.kebabCase(`${kebabCase}.2`)).toBe(false)\n expect(caseUtils.is.snakeCase(`${snakeCase}.2`)).toBe(false)\n expect(caseUtils.is.screamingSnakeCase(`${screamingSnakeCase}.2`)).toBe(false)\n expect(caseUtils.is.camelCase(`${camelCase}.2`)).toBe(false)\n})\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -29,11 +29,13 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
29
29
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
30
  var esbuild_utils_exports = {};
31
31
  __export(esbuild_utils_exports, {
32
+ IncrementalBuildContext: () => IncrementalBuildContext,
32
33
  buildCode: () => buildCode,
33
34
  buildEntrypoint: () => buildEntrypoint
34
35
  });
35
36
  module.exports = __toCommonJS(esbuild_utils_exports);
36
37
  var esb = __toESM(require("esbuild"));
38
+ var import_lodash = __toESM(require("lodash"));
37
39
  __reExport(esbuild_utils_exports, require("esbuild"), module.exports);
38
40
  const DEFAULT_OPTIONS = {
39
41
  bundle: true,
@@ -47,6 +49,33 @@ const DEFAULT_OPTIONS = {
47
49
  // important : https://github.com/node-fetch/node-fetch/issues/784#issuecomment-1014768204
48
50
  minify: false
49
51
  };
52
+ class IncrementalBuildContext {
53
+ _context;
54
+ _previousProps;
55
+ _previousOpts = {};
56
+ _createContext(props, opts = {}) {
57
+ const { absWorkingDir, code, outfile } = props;
58
+ return esb.context({
59
+ ...DEFAULT_OPTIONS,
60
+ ...opts,
61
+ absWorkingDir,
62
+ outfile,
63
+ stdin: { contents: code, resolveDir: absWorkingDir, loader: "ts" },
64
+ write: true
65
+ });
66
+ }
67
+ async rebuild(props, opts = {}) {
68
+ if (!this._context || !import_lodash.default.isEqual(props, this._previousProps) || !import_lodash.default.isEqual(opts, this._previousOpts)) {
69
+ if (this._context) {
70
+ await this._context.dispose();
71
+ }
72
+ this._context = await this._createContext(props, opts);
73
+ this._previousOpts = opts;
74
+ this._previousProps = props;
75
+ }
76
+ await this._context?.rebuild();
77
+ }
78
+ }
50
79
  function buildCode(props, opts = {}) {
51
80
  const { absWorkingDir, code, outfile } = props;
52
81
  return esb.build({
@@ -71,7 +100,9 @@ function buildEntrypoint(props, opts = {}) {
71
100
  }
72
101
  // Annotate the CommonJS export names for ESM import in node:
73
102
  0 && (module.exports = {
103
+ IncrementalBuildContext,
74
104
  buildCode,
75
- buildEntrypoint
105
+ buildEntrypoint,
106
+ ...require("esbuild")
76
107
  });
77
108
  //# sourceMappingURL=esbuild-utils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/esbuild-utils.ts"],
4
- "sourcesContent": ["import * as esb from 'esbuild'\n\nexport * from 'esbuild'\n\ntype BaseProps = {\n absWorkingDir: string\n}\n\nexport type BuildCodeProps = BaseProps & {\n code: string\n outfile: string\n}\n\nexport type BuildEntrypointProps = BaseProps & {\n entrypoint: string\n}\n\nconst DEFAULT_OPTIONS: esb.BuildOptions = {\n bundle: true,\n sourcemap: false,\n logLevel: 'silent',\n platform: 'node',\n target: 'es2020',\n legalComments: 'none',\n logOverride: { 'equals-negative-zero': 'silent' },\n keepNames: true, // important : https://github.com/node-fetch/node-fetch/issues/784#issuecomment-1014768204\n minify: false,\n}\n\n/**\n * Bundles a string of typescript code and writes the output to a file\n */\nexport function buildCode(props: BuildCodeProps, opts: esb.BuildOptions = {}): Promise<esb.BuildResult> {\n const { absWorkingDir, code, outfile } = props\n return esb.build({\n ...DEFAULT_OPTIONS,\n ...opts,\n absWorkingDir,\n outfile,\n stdin: { contents: code, resolveDir: absWorkingDir, loader: 'ts' },\n write: true,\n })\n}\n\n/**\n * Bundles a typescript file and returns the output as a string\n */\nexport function buildEntrypoint(\n props: BuildEntrypointProps,\n opts: esb.BuildOptions = {}\n): Promise<esb.BuildResult & { outputFiles: esb.OutputFile[] }> {\n const { absWorkingDir, entrypoint } = props\n return esb.build({\n ...DEFAULT_OPTIONS,\n ...opts,\n absWorkingDir,\n entryPoints: [entrypoint],\n outfile: undefined,\n write: false,\n })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAqB;AAErB,kCAAc,oBAFd;AAiBA,MAAM,kBAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa,EAAE,wBAAwB,SAAS;AAAA,EAChD,WAAW;AAAA;AAAA,EACX,QAAQ;AACV;AAKO,SAAS,UAAU,OAAuB,OAAyB,CAAC,GAA6B;AACtG,QAAM,EAAE,eAAe,MAAM,QAAQ,IAAI;AACzC,SAAO,IAAI,MAAM;AAAA,IACf,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAU,MAAM,YAAY,eAAe,QAAQ,KAAK;AAAA,IACjE,OAAO;AAAA,EACT,CAAC;AACH;AAKO,SAAS,gBACd,OACA,OAAyB,CAAC,GACoC;AAC9D,QAAM,EAAE,eAAe,WAAW,IAAI;AACtC,SAAO,IAAI,MAAM;AAAA,IACf,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,aAAa,CAAC,UAAU;AAAA,IACxB,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AACH;",
6
- "names": []
4
+ "sourcesContent": ["import * as esb from 'esbuild'\nimport _ from 'lodash'\n\nexport * from 'esbuild'\n\ntype BaseProps = {\n absWorkingDir: string\n}\n\nexport type BuildCodeProps = BaseProps & {\n code: string\n outfile: string\n}\n\nexport type BuildEntrypointProps = BaseProps & {\n entrypoint: string\n}\n\nconst DEFAULT_OPTIONS: esb.BuildOptions = {\n bundle: true,\n sourcemap: false,\n logLevel: 'silent',\n platform: 'node',\n target: 'es2020',\n legalComments: 'none',\n logOverride: { 'equals-negative-zero': 'silent' },\n keepNames: true, // important : https://github.com/node-fetch/node-fetch/issues/784#issuecomment-1014768204\n minify: false,\n}\n\nexport class IncrementalBuildContext {\n private _context: esb.BuildContext | undefined\n private _previousProps: BuildCodeProps | undefined\n private _previousOpts: esb.BuildOptions = {}\n\n private _createContext(props: BuildCodeProps, opts: esb.BuildOptions = {}): Promise<esb.BuildContext> {\n const { absWorkingDir, code, outfile } = props\n return esb.context({\n ...DEFAULT_OPTIONS,\n ...opts,\n absWorkingDir,\n outfile,\n stdin: { contents: code, resolveDir: absWorkingDir, loader: 'ts' },\n write: true,\n })\n }\n\n public async rebuild(props: BuildCodeProps, opts: esb.BuildOptions = {}) {\n if (!this._context || !_.isEqual(props, this._previousProps) || !_.isEqual(opts, this._previousOpts)) {\n if (this._context) {\n await this._context.dispose()\n }\n this._context = await this._createContext(props, opts)\n this._previousOpts = opts\n this._previousProps = props\n }\n await this._context?.rebuild()\n }\n}\n\n/**\n * Bundles a string of typescript code and writes the output to a file\n */\nexport function buildCode(props: BuildCodeProps, opts: esb.BuildOptions = {}): Promise<esb.BuildResult> {\n const { absWorkingDir, code, outfile } = props\n return esb.build({\n ...DEFAULT_OPTIONS,\n ...opts,\n absWorkingDir,\n outfile,\n stdin: { contents: code, resolveDir: absWorkingDir, loader: 'ts' },\n write: true,\n })\n}\n\n/**\n * Bundles a typescript file and returns the output as a string\n */\nexport function buildEntrypoint(\n props: BuildEntrypointProps,\n opts: esb.BuildOptions = {}\n): Promise<esb.BuildResult & { outputFiles: esb.OutputFile[] }> {\n const { absWorkingDir, entrypoint } = props\n return esb.build({\n ...DEFAULT_OPTIONS,\n ...opts,\n absWorkingDir,\n entryPoints: [entrypoint],\n outfile: undefined,\n write: false,\n })\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAqB;AACrB,oBAAc;AAEd,kCAAc,oBAHd;AAkBA,MAAM,kBAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,aAAa,EAAE,wBAAwB,SAAS;AAAA,EAChD,WAAW;AAAA;AAAA,EACX,QAAQ;AACV;AAEO,MAAM,wBAAwB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,gBAAkC,CAAC;AAAA,EAEnC,eAAe,OAAuB,OAAyB,CAAC,GAA8B;AACpG,UAAM,EAAE,eAAe,MAAM,QAAQ,IAAI;AACzC,WAAO,IAAI,QAAQ;AAAA,MACjB,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,OAAO,EAAE,UAAU,MAAM,YAAY,eAAe,QAAQ,KAAK;AAAA,MACjE,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAa,QAAQ,OAAuB,OAAyB,CAAC,GAAG;AACvE,QAAI,CAAC,KAAK,YAAY,CAAC,cAAAA,QAAE,QAAQ,OAAO,KAAK,cAAc,KAAK,CAAC,cAAAA,QAAE,QAAQ,MAAM,KAAK,aAAa,GAAG;AACpG,UAAI,KAAK,UAAU;AACjB,cAAM,KAAK,SAAS,QAAQ;AAAA,MAC9B;AACA,WAAK,WAAW,MAAM,KAAK,eAAe,OAAO,IAAI;AACrD,WAAK,gBAAgB;AACrB,WAAK,iBAAiB;AAAA,IACxB;AACA,UAAM,KAAK,UAAU,QAAQ;AAAA,EAC/B;AACF;AAKO,SAAS,UAAU,OAAuB,OAAyB,CAAC,GAA6B;AACtG,QAAM,EAAE,eAAe,MAAM,QAAQ,IAAI;AACzC,SAAO,IAAI,MAAM;AAAA,IACf,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,OAAO,EAAE,UAAU,MAAM,YAAY,eAAe,QAAQ,KAAK;AAAA,IACjE,OAAO;AAAA,EACT,CAAC;AACH;AAKO,SAAS,gBACd,OACA,OAAyB,CAAC,GACoC;AAC9D,QAAM,EAAE,eAAe,WAAW,IAAI;AACtC,SAAO,IAAI,MAAM;AAAA,IACf,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,IACA,aAAa,CAAC,UAAU;AAAA,IACxB,SAAS;AAAA,IACT,OAAO;AAAA,EACT,CAAC;AACH;",
6
+ "names": ["_"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/file-watcher.ts"],
4
4
  "sourcesContent": ["import watcher from '@parcel/watcher'\nimport { debounceAsync } from './concurrency-utils'\nimport { EventEmitter } from './event-emitter'\n\nexport type FileChangeHandler = (events: watcher.Event[]) => Promise<void>\n\ntype EmptyObject = Record<never, never>\ntype FileWatcherEvent = {\n error: unknown\n close: EmptyObject\n}\n\ntype FileWatcherOptions = watcher.Options & {\n debounceMs?: number\n}\n\n/**\n * Wraps the Parcel file watcher to ensure errors can be catched in an async/await fashion\n */\nexport class FileWatcher {\n public static async watch(dir: string, fn: FileChangeHandler, opt?: FileWatcherOptions) {\n const eventEmitter = new EventEmitter<FileWatcherEvent>()\n\n let subscriptionHandler = async (err: Error | null, events: watcher.Event[]) => {\n if (err) {\n eventEmitter.emit('error', err)\n return\n }\n\n try {\n await fn(events)\n } catch (thrown) {\n eventEmitter.emit('error', thrown)\n }\n }\n\n if (opt?.debounceMs) {\n subscriptionHandler = debounceAsync(subscriptionHandler, opt.debounceMs)\n }\n\n const subscription = await watcher.subscribe(dir, subscriptionHandler, opt)\n return new FileWatcher(subscription, eventEmitter)\n }\n\n private constructor(\n private _subscription: watcher.AsyncSubscription,\n private _errorEmitter: EventEmitter<FileWatcherEvent>\n ) {}\n\n public async close() {\n await this._subscription.unsubscribe()\n this._errorEmitter.emit('close', {})\n }\n\n public wait = () =>\n new Promise((resolve, reject) => {\n this._errorEmitter.once('error', reject)\n this._errorEmitter.once('close', resolve)\n })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,+BAA8B;AAC9B,2BAA6B;AAiBtB,MAAM,YAAY;AAAA,EAyBf,YACE,eACA,eACR;AAFQ;AACA;AAAA,EACP;AAAA,EA3BH,aAAoB,MAAM,KAAa,IAAuB,KAA0B;AACtF,UAAM,eAAe,IAAI,kCAA+B;AAExD,QAAI,sBAAsB,OAAO,KAAmB,WAA4B;AAC9E,UAAI,KAAK;AACP,qBAAa,KAAK,SAAS,GAAG;AAC9B;AAAA,MACF;AAEA,UAAI;AACF,cAAM,GAAG,MAAM;AAAA,MACjB,SAAS,QAAP;AACA,qBAAa,KAAK,SAAS,MAAM;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,KAAK,YAAY;AACnB,gCAAsB,wCAAc,qBAAqB,IAAI,UAAU;AAAA,IACzE;AAEA,UAAM,eAAe,MAAM,eAAAA,QAAQ,UAAU,KAAK,qBAAqB,GAAG;AAC1E,WAAO,IAAI,YAAY,cAAc,YAAY;AAAA,EACnD;AAAA,EAOA,MAAa,QAAQ;AACnB,UAAM,KAAK,cAAc,YAAY;AACrC,SAAK,cAAc,KAAK,SAAS,CAAC,CAAC;AAAA,EACrC;AAAA,EAEO,OAAO,MACZ,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,SAAK,cAAc,KAAK,SAAS,MAAM;AACvC,SAAK,cAAc,KAAK,SAAS,OAAO;AAAA,EAC1C,CAAC;AACL;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AACpB,+BAA8B;AAC9B,2BAA6B;AAiBtB,MAAM,YAAY;AAAA,EAyBf,YACE,eACA,eACR;AAFQ;AACA;AAAA,EACP;AAAA,EA3BH,aAAoB,MAAM,KAAa,IAAuB,KAA0B;AACtF,UAAM,eAAe,IAAI,kCAA+B;AAExD,QAAI,sBAAsB,OAAO,KAAmB,WAA4B;AAC9E,UAAI,KAAK;AACP,qBAAa,KAAK,SAAS,GAAG;AAC9B;AAAA,MACF;AAEA,UAAI;AACF,cAAM,GAAG,MAAM;AAAA,MACjB,SAAS,QAAQ;AACf,qBAAa,KAAK,SAAS,MAAM;AAAA,MACnC;AAAA,IACF;AAEA,QAAI,KAAK,YAAY;AACnB,gCAAsB,wCAAc,qBAAqB,IAAI,UAAU;AAAA,IACzE;AAEA,UAAM,eAAe,MAAM,eAAAA,QAAQ,UAAU,KAAK,qBAAqB,GAAG;AAC1E,WAAO,IAAI,YAAY,cAAc,YAAY;AAAA,EACnD;AAAA,EAOA,MAAa,QAAQ;AACnB,UAAM,KAAK,cAAc,YAAY;AACrC,SAAK,cAAc,KAAK,SAAS,CAAC,CAAC;AAAA,EACrC;AAAA,EAEO,OAAO,MACZ,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC/B,SAAK,cAAc,KAAK,SAAS,MAAM;AACvC,SAAK,cAAc,KAAK,SAAS,OAAO;AAAA,EAC1C,CAAC;AACL;",
6
6
  "names": ["watcher"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/prompt-utils.ts"],
4
4
  "sourcesContent": ["import prompts from 'prompts'\nimport type { Logger } from '../logger'\n\nexport type CLIPromptsProps = {\n confirm: boolean\n}\n\ntype ChoiceValueType = string | number\n\nexport type CLIPromptsChoice<V extends ChoiceValueType> = {\n title: string\n value: V\n}\n\ntype PasswordOptions = Partial<{\n default: string | undefined\n initial: string\n}>\ntype SelectOptions<V extends ChoiceValueType> = Partial<{\n default: V | undefined\n initial: CLIPromptsChoice<V>\n choices: CLIPromptsChoice<V>[]\n}>\ntype TextOptions = Partial<{\n default: string | undefined\n initial: string\n}>\n\nexport class CLIPrompt {\n public constructor(\n private _props: CLIPromptsProps,\n private _logger: Logger\n ) {}\n\n public async confirm(message: string): Promise<boolean> {\n if (this._props.confirm) {\n this._logger.debug(`Confirming automatically (non-interactive mode): ${message}`)\n return true\n }\n\n const { confirm } = await this._prompts({\n type: 'confirm',\n name: 'confirm',\n message,\n initial: false,\n })\n\n if (!confirm) {\n return false\n }\n return true\n }\n\n public async password(message: string, opts: PasswordOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'password',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n public async select<V extends ChoiceValueType = string>(\n message: string,\n opts: SelectOptions<V> = {}\n ): Promise<V | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n // NOTE: whilst Prompts supports string, number, date and boolean values for\n // choices, it behaves unexpectedly when the value is a number and is\n // equal to 0. To work around this, we convert the value to a symbol\n // if it is 0, and then convert it back to a number if it was 0.\n\n const isNumber = typeof opts?.choices?.[0]?.value === 'number'\n const transformedChoices = isNumber\n ? opts?.choices?.map((c) => ({ ...c, value: c.value === 0 ? Symbol.for('0') : c.value }))\n : opts?.choices\n\n const { prompted } = await this._prompts({\n type: 'autocomplete',\n name: 'prompted',\n message,\n initial: opts?.initial?.value,\n choices: transformedChoices as prompts.PromptObject['choices'],\n })\n\n return prompted !== undefined ? (isNumber && prompted === Symbol.for('0') ? 0 : prompted) : undefined\n }\n\n public async text(message: string, opts: TextOptions = {}): Promise<string | undefined> {\n if (this._props.confirm) {\n this._logger.debug(`Return default (non-interactive mode): ${message}`)\n return opts?.default\n }\n\n const { prompted } = await this._prompts({\n type: 'text',\n name: 'prompted',\n message,\n initial: opts?.initial,\n })\n\n return prompted ? prompted : undefined\n }\n\n private _prompts = (...args: Parameters<typeof prompts>): ReturnType<typeof prompts> => {\n this._logger.cleanup()\n return prompts(...args)\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AA4Bb,MAAM,UAAU;AAAA,EACd,YACG,QACA,SACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,MAAa,QAAQ,SAAmC;AACtD,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,oDAAoD,SAAS;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,SAAS;AAAA,MACtC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,SAAiB,OAAwB,CAAC,GAAgC;AAC9F,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAa,OACX,SACA,OAAyB,CAAC,GACF;AACxB,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAOA,UAAM,WAAW,OAAO,MAAM,UAAU,CAAC,GAAG,UAAU;AACtD,UAAM,qBAAqB,WACvB,MAAM,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,OAAO,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,IACtF,MAAM;AAEV,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM,SAAS;AAAA,MACxB,SAAS;AAAA,IACX,CAAC;AAED,WAAO,aAAa,SAAa,YAAY,aAAa,OAAO,IAAI,GAAG,IAAI,IAAI,WAAY;AAAA,EAC9F;AAAA,EAEA,MAAa,KAAK,SAAiB,OAAoB,CAAC,GAAgC;AACtF,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,SAAS;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEQ,WAAW,IAAI,SAAiE;AACtF,SAAK,QAAQ,QAAQ;AACrB,eAAO,eAAAA,SAAQ,GAAG,IAAI;AAAA,EACxB;AACF;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAoB;AA4Bb,MAAM,UAAU;AAAA,EACd,YACG,QACA,SACR;AAFQ;AACA;AAAA,EACP;AAAA,EAEH,MAAa,QAAQ,SAAmC;AACtD,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,oDAAoD,OAAO,EAAE;AAChF,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,KAAK,SAAS;AAAA,MACtC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,SAAiB,OAAwB,CAAC,GAAgC;AAC9F,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,OAAO,EAAE;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAa,OACX,SACA,OAAyB,CAAC,GACF;AACxB,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,OAAO,EAAE;AACtE,aAAO,MAAM;AAAA,IACf;AAOA,UAAM,WAAW,OAAO,MAAM,UAAU,CAAC,GAAG,UAAU;AACtD,UAAM,qBAAqB,WACvB,MAAM,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,UAAU,IAAI,OAAO,IAAI,GAAG,IAAI,EAAE,MAAM,EAAE,IACtF,MAAM;AAEV,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM,SAAS;AAAA,MACxB,SAAS;AAAA,IACX,CAAC;AAED,WAAO,aAAa,SAAa,YAAY,aAAa,OAAO,IAAI,GAAG,IAAI,IAAI,WAAY;AAAA,EAC9F;AAAA,EAEA,MAAa,KAAK,SAAiB,OAAoB,CAAC,GAAgC;AACtF,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,QAAQ,MAAM,0CAA0C,OAAO,EAAE;AACtE,aAAO,MAAM;AAAA,IACf;AAEA,UAAM,EAAE,SAAS,IAAI,MAAM,KAAK,SAAS;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,WAAO,WAAW,WAAW;AAAA,EAC/B;AAAA,EAEQ,WAAW,IAAI,SAAiE;AACtF,SAAK,QAAQ,QAAQ;AACrB,eAAO,eAAAA,SAAQ,GAAG,IAAI;AAAA,EACxB;AACF;",
6
6
  "names": ["prompts"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/require-utils.ts"],
4
4
  "sourcesContent": ["import Module from 'module'\nimport pathlib from 'path'\n\nexport const requireJsFile = <T>(path: string): T => {\n return require(path)\n}\n\nexport const requireJsCode = <T>(code: string): T => {\n const filedir = 'tmp'\n const filename = `${Date.now()}.js`\n\n const fileid = pathlib.join(filedir, filename)\n\n const m = new Module(fileid)\n m.filename = filename\n\n try {\n // @ts-ignore\n m._compile(code, filename)\n return m.exports\n } catch (thrown: unknown) {\n const error = thrown instanceof Error ? thrown : new Error(`${thrown}`)\n throw _injectStackTrace(error, code, filename)\n }\n}\n\nconst STACK_TRACE_SURROUNDING_LINES = 3\n\nconst _injectStackTrace = (compileError: Error, code: string, filename: string): Error => {\n if (!compileError.stack || !compileError.stack.includes(`${filename}:`)) {\n return compileError\n }\n\n // Extract line and column from the stack trace:\n const [, locationInfo] = compileError.stack.split(`${filename}:`, 2)\n if (!locationInfo) {\n return compileError\n }\n\n const [lineNoStr, _rest] = locationInfo.split(':', 2)\n if (!lineNoStr || !_rest) {\n return compileError\n }\n\n const [columnStr] = _rest.split(')', 1)\n if (!columnStr) {\n return compileError\n }\n\n const lineNo = parseInt(lineNoStr)\n const column = parseInt(columnStr)\n\n // Build the stack trace:\n const allLines = code.split('\\n')\n const linesBefore = allLines.slice(Math.max(0, lineNo - 1 - STACK_TRACE_SURROUNDING_LINES), lineNo - 1)\n const offendingLine = allLines[lineNo - 1]\n const caretLine = ' '.repeat(column - 1) + '^'\n const linesAfter = allLines.slice(lineNo, Math.min(allLines.length, lineNo + STACK_TRACE_SURROUNDING_LINES))\n const stackTrace = [...linesBefore, offendingLine, caretLine, ...linesAfter].join('\\n')\n\n return new Error(`${compileError.message}\\n\\nOffending code:\\n\\n${stackTrace}`, { cause: compileError })\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB,kBAAoB;AAEb,MAAM,gBAAgB,CAAI,SAAoB;AACnD,SAAO,QAAQ,IAAI;AACrB;AAEO,MAAM,gBAAgB,CAAI,SAAoB;AACnD,QAAM,UAAU;AAChB,QAAM,WAAW,GAAG,KAAK,IAAI;AAE7B,QAAM,SAAS,YAAAA,QAAQ,KAAK,SAAS,QAAQ;AAE7C,QAAM,IAAI,IAAI,cAAAC,QAAO,MAAM;AAC3B,IAAE,WAAW;AAEb,MAAI;AAEF,MAAE,SAAS,MAAM,QAAQ;AACzB,WAAO,EAAE;AAAA,EACX,SAAS,QAAP;AACA,UAAM,QAAQ,kBAAkB,QAAQ,SAAS,IAAI,MAAM,GAAG,QAAQ;AACtE,UAAM,kBAAkB,OAAO,MAAM,QAAQ;AAAA,EAC/C;AACF;AAEA,MAAM,gCAAgC;AAEtC,MAAM,oBAAoB,CAAC,cAAqB,MAAc,aAA4B;AACxF,MAAI,CAAC,aAAa,SAAS,CAAC,aAAa,MAAM,SAAS,GAAG,WAAW,GAAG;AACvE,WAAO;AAAA,EACT;AAGA,QAAM,CAAC,EAAE,YAAY,IAAI,aAAa,MAAM,MAAM,GAAG,aAAa,CAAC;AACnE,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,WAAW,KAAK,IAAI,aAAa,MAAM,KAAK,CAAC;AACpD,MAAI,CAAC,aAAa,CAAC,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,SAAS,IAAI,MAAM,MAAM,KAAK,CAAC;AACtC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,SAAS;AACjC,QAAM,SAAS,SAAS,SAAS;AAGjC,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,cAAc,SAAS,MAAM,KAAK,IAAI,GAAG,SAAS,IAAI,6BAA6B,GAAG,SAAS,CAAC;AACtG,QAAM,gBAAgB,SAAS,SAAS,CAAC;AACzC,QAAM,YAAY,IAAI,OAAO,SAAS,CAAC,IAAI;AAC3C,QAAM,aAAa,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAS,QAAQ,SAAS,6BAA6B,CAAC;AAC3G,QAAM,aAAa,CAAC,GAAG,aAAa,eAAe,WAAW,GAAG,UAAU,EAAE,KAAK,IAAI;AAEtF,SAAO,IAAI,MAAM,GAAG,aAAa;AAAA;AAAA;AAAA;AAAA,EAAiC,cAAc,EAAE,OAAO,aAAa,CAAC;AACzG;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB,kBAAoB;AAEb,MAAM,gBAAgB,CAAI,SAAoB;AACnD,SAAO,QAAQ,IAAI;AACrB;AAEO,MAAM,gBAAgB,CAAI,SAAoB;AACnD,QAAM,UAAU;AAChB,QAAM,WAAW,GAAG,KAAK,IAAI,CAAC;AAE9B,QAAM,SAAS,YAAAA,QAAQ,KAAK,SAAS,QAAQ;AAE7C,QAAM,IAAI,IAAI,cAAAC,QAAO,MAAM;AAC3B,IAAE,WAAW;AAEb,MAAI;AAEF,MAAE,SAAS,MAAM,QAAQ;AACzB,WAAO,EAAE;AAAA,EACX,SAAS,QAAiB;AACxB,UAAM,QAAQ,kBAAkB,QAAQ,SAAS,IAAI,MAAM,GAAG,MAAM,EAAE;AACtE,UAAM,kBAAkB,OAAO,MAAM,QAAQ;AAAA,EAC/C;AACF;AAEA,MAAM,gCAAgC;AAEtC,MAAM,oBAAoB,CAAC,cAAqB,MAAc,aAA4B;AACxF,MAAI,CAAC,aAAa,SAAS,CAAC,aAAa,MAAM,SAAS,GAAG,QAAQ,GAAG,GAAG;AACvE,WAAO;AAAA,EACT;AAGA,QAAM,CAAC,EAAE,YAAY,IAAI,aAAa,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC;AACnE,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,WAAW,KAAK,IAAI,aAAa,MAAM,KAAK,CAAC;AACpD,MAAI,CAAC,aAAa,CAAC,OAAO;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,SAAS,IAAI,MAAM,MAAM,KAAK,CAAC;AACtC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,SAAS,SAAS;AACjC,QAAM,SAAS,SAAS,SAAS;AAGjC,QAAM,WAAW,KAAK,MAAM,IAAI;AAChC,QAAM,cAAc,SAAS,MAAM,KAAK,IAAI,GAAG,SAAS,IAAI,6BAA6B,GAAG,SAAS,CAAC;AACtG,QAAM,gBAAgB,SAAS,SAAS,CAAC;AACzC,QAAM,YAAY,IAAI,OAAO,SAAS,CAAC,IAAI;AAC3C,QAAM,aAAa,SAAS,MAAM,QAAQ,KAAK,IAAI,SAAS,QAAQ,SAAS,6BAA6B,CAAC;AAC3G,QAAM,aAAa,CAAC,GAAG,aAAa,eAAe,WAAW,GAAG,UAAU,EAAE,KAAK,IAAI;AAEtF,SAAO,IAAI,MAAM,GAAG,aAAa,OAAO;AAAA;AAAA;AAAA;AAAA,EAA0B,UAAU,IAAI,EAAE,OAAO,aAAa,CAAC;AACzG;",
6
6
  "names": ["pathlib", "Module"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/require-utils.test.ts"],
4
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\nconst getError = (fn: () => void): Error | undefined => {\n try {\n fn()\n return\n } catch (thrown: unknown) {\n return thrown instanceof Error ? thrown : new Error(`${thrown}`)\n }\n}\n\ntest('require js code should indicate issue in stack trace', () => {\n const code = `\n var foo = undefined\n module.exports = {\n bar: foo.bar\n }\n `\n\n const error = getError(() => requireUtils.requireJsCode(code))\n\n expect(error).toBeDefined()\n expect(error?.message).toContain('bar: foo.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;AAED,MAAM,WAAW,CAAC,OAAsC;AACtD,MAAI;AACF,OAAG;AACH;AAAA,EACF,SAAS,QAAP;AACA,WAAO,kBAAkB,QAAQ,SAAS,IAAI,MAAM,GAAG,QAAQ;AAAA,EACjE;AACF;AAAA,IAEA,oBAAK,wDAAwD,MAAM;AACjE,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,QAAM,QAAQ,SAAS,MAAM,aAAa,cAAc,IAAI,CAAC;AAE7D,4BAAO,KAAK,EAAE,YAAY;AAC1B,4BAAO,OAAO,OAAO,EAAE,UAAU,cAAc;AACjD,CAAC;",
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;AAED,MAAM,WAAW,CAAC,OAAsC;AACtD,MAAI;AACF,OAAG;AACH;AAAA,EACF,SAAS,QAAiB;AACxB,WAAO,kBAAkB,QAAQ,SAAS,IAAI,MAAM,GAAG,MAAM,EAAE;AAAA,EACjE;AACF;AAAA,IAEA,oBAAK,wDAAwD,MAAM;AACjE,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAOb,QAAM,QAAQ,SAAS,MAAM,aAAa,cAAc,IAAI,CAAC;AAE7D,4BAAO,KAAK,EAAE,YAAY;AAC1B,4BAAO,OAAO,OAAO,EAAE,UAAU,cAAc;AACjD,CAAC;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/tunnel-utils.ts"],
4
4
  "sourcesContent": ["import { TunnelTail, ClientCloseEvent, ClientErrorEvent, errors } 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 public constructor(\n private _tunnelUrl: string,\n private _tunnelId: string,\n private _logger: Logger\n ) {}\n\n public async start(): Promise<void> {\n if (this._closed) {\n throw new Error('Cannot start: Tunnel is closed')\n }\n if (this._started) {\n throw new Error('Cannot start: 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('Cannot wait: 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\n if (code === errors.CLOSE_CODES.TUNNEL_ID_CONFLICT) {\n throw new Error('Cannot start: Tunnel Id is already used, choose a different tunnel id.')\n }\n\n this._reconnectSync({ type: 'close', ev: { code, reason, target, type, wasClean } })\n })\n }\n}\n"],
5
- "mappings": "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",
5
+ "mappings": "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",
6
6
  "names": ["tunnel"]
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/url-utils.ts"],
4
4
  "sourcesContent": ["const _PROTOCOLS = ['http', 'https', 'ws', 'wss'] as const\n\nexport type Protocol = (typeof _PROTOCOLS)[number]\n\nexport type Path = `/${string}`\n\nexport type Url = {\n protocol: Protocol\n host: string\n port?: number\n path?: Path\n}\n\nexport type UrlParseResult =\n | {\n status: 'success'\n url: Url\n }\n | {\n status: 'error'\n error: string\n }\n\nconst toPath = (path: string): Path => {\n if (!path.startsWith('/')) {\n return `/${path}`\n }\n return path as Path\n}\n\nexport function parse(hostOrUrl: string): UrlParseResult {\n try {\n const url = new URL(hostOrUrl)\n return {\n status: 'success',\n url: {\n protocol: url.protocol.replace(':', '') as Url['protocol'],\n host: url.hostname,\n port: url.port ? parseInt(url.port) : undefined,\n path: toPath(url.pathname),\n },\n }\n } catch (thrown) {\n const message = thrown instanceof Error ? thrown.message : `${thrown}`\n return {\n status: 'error',\n error: message,\n }\n }\n}\n\nexport const format = (url: Url): string => {\n let formatted = `${url.protocol}://${url.host}`\n if (url.port) {\n formatted += `:${url.port}`\n }\n if (url.path && url.path !== '/') {\n formatted += url.path\n }\n return formatted\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,aAAa,CAAC,QAAQ,SAAS,MAAM,KAAK;AAuBhD,MAAM,SAAS,CAAC,SAAuB;AACrC,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,WAAO,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAEO,SAAS,MAAM,WAAmC;AACvD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,KAAK;AAAA,QACH,UAAU,IAAI,SAAS,QAAQ,KAAK,EAAE;AAAA,QACtC,MAAM,IAAI;AAAA,QACV,MAAM,IAAI,OAAO,SAAS,IAAI,IAAI,IAAI;AAAA,QACtC,MAAM,OAAO,IAAI,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,QAAP;AACA,UAAM,UAAU,kBAAkB,QAAQ,OAAO,UAAU,GAAG;AAC9D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,MAAM,SAAS,CAAC,QAAqB;AAC1C,MAAI,YAAY,GAAG,IAAI,cAAc,IAAI;AACzC,MAAI,IAAI,MAAM;AACZ,iBAAa,IAAI,IAAI;AAAA,EACvB;AACA,MAAI,IAAI,QAAQ,IAAI,SAAS,KAAK;AAChC,iBAAa,IAAI;AAAA,EACnB;AACA,SAAO;AACT;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAM,aAAa,CAAC,QAAQ,SAAS,MAAM,KAAK;AAuBhD,MAAM,SAAS,CAAC,SAAuB;AACrC,MAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEO,SAAS,MAAM,WAAmC;AACvD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,SAAS;AAC7B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,KAAK;AAAA,QACH,UAAU,IAAI,SAAS,QAAQ,KAAK,EAAE;AAAA,QACtC,MAAM,IAAI;AAAA,QACV,MAAM,IAAI,OAAO,SAAS,IAAI,IAAI,IAAI;AAAA,QACtC,MAAM,OAAO,IAAI,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,SAAS,QAAQ;AACf,UAAM,UAAU,kBAAkB,QAAQ,OAAO,UAAU,GAAG,MAAM;AACpE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,MAAM,SAAS,CAAC,QAAqB;AAC1C,MAAI,YAAY,GAAG,IAAI,QAAQ,MAAM,IAAI,IAAI;AAC7C,MAAI,IAAI,MAAM;AACZ,iBAAa,IAAI,IAAI,IAAI;AAAA,EAC3B;AACA,MAAI,IAAI,QAAQ,IAAI,SAAS,KAAK;AAChC,iBAAa,IAAI;AAAA,EACnB;AACA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/worker/child-entrypoint.ts"],
4
4
  "sourcesContent": ["import * as utils from '../utils'\nimport { CONFIG_ENV_KEY, configSchema } from './config'\nimport { ChildProcessProps, processProps } from './is-child'\n\nexport const ENTRY_POINT = __filename\n\nconst childProcessEntrypoint = async (_props: ChildProcessProps) => {\n const rawConfig = process.env[CONFIG_ENV_KEY]\n if (!rawConfig) {\n throw new Error(`Config variable ${CONFIG_ENV_KEY} was not set`)\n }\n const config = configSchema.parse(JSON.parse(rawConfig))\n\n if (config.type === 'code') {\n utils.require.requireJsCode(config.code)\n }\n if (config.type === 'file') {\n utils.require.requireJsFile(config.file)\n }\n}\n\nif (processProps.type === 'child') {\n // here we are in the child process\n void childProcessEntrypoint(processProps)\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AACvB,oBAA6C;AAC7C,sBAAgD;AAEzC,MAAM,cAAc;AAE3B,MAAM,yBAAyB,OAAO,WAA8B;AAClE,QAAM,YAAY,QAAQ,IAAI,4BAAc;AAC5C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mBAAmB,0CAA4B;AAAA,EACjE;AACA,QAAM,SAAS,2BAAa,MAAM,KAAK,MAAM,SAAS,CAAC;AAEvD,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,QAAQ,cAAc,OAAO,IAAI;AAAA,EACzC;AACA,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,QAAQ,cAAc,OAAO,IAAI;AAAA,EACzC;AACF;AAEA,IAAI,6BAAa,SAAS,SAAS;AAEjC,OAAK,uBAAuB,4BAAY;AAC1C;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AACvB,oBAA6C;AAC7C,sBAAgD;AAEzC,MAAM,cAAc;AAE3B,MAAM,yBAAyB,OAAO,WAA8B;AAClE,QAAM,YAAY,QAAQ,IAAI,4BAAc;AAC5C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,mBAAmB,4BAAc,cAAc;AAAA,EACjE;AACA,QAAM,SAAS,2BAAa,MAAM,KAAK,MAAM,SAAS,CAAC;AAEvD,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,QAAQ,cAAc,OAAO,IAAI;AAAA,EACzC;AACA,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAM,QAAQ,cAAc,OAAO,IAAI;AAAA,EACzC;AACF;AAEA,IAAI,6BAAa,SAAS,SAAS;AAEjC,OAAK,uBAAuB,4BAAY;AAC1C;",
6
6
  "names": []
7
7
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/worker/child-wrapper.ts"],
4
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 void childExitPromise.finally(() => {\n instance._exited = true\n })\n\n await childSpawnPromise\n\n return instance\n }\n\n private _exited = false\n private constructor(\n private _child: childProcess.ChildProcess,\n private _exitPromise: Promise<ChildOutput>\n ) {}\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;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,YACE,QACA,cACR;AAFQ;AACA;AAAA,EACP;AAAA,EAjCH,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,6BAAa,GAAG;AAAA,QACjB,CAAC,4BAAc,GAAG,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,SAAK,iBAAiB,QAAQ,MAAM;AAClC,eAAS,UAAU;AAAA,IACrB,CAAC;AAED,UAAM;AAEN,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU;AAAA,EAMlB,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;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA8B;AAE9B,8BAA4B;AAC5B,oBAAuC;AACvC,sBAA+D;AAO/D,MAAM,kBAA0C;AAAA,EAC9C,aAAa;AAAA;AACf;AAEA,MAAM,sBAAsB,CAAC,OAAkC,WAC7D,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,QAAM,GAAG,SAAS,MAAM;AACtB,WAAO,MAAM,kCAAkC,MAAM,GAAG,EAAE;AAC1D,YAAQ;AAAA,EACV,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,OAAO,EAAE;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,QAAQ,eAAe,MAAM,EAAE;AAAA,EAChF,CAAC;AACD,QAAM,GAAG,QAAQ,CAAC,UAAyB,WAAkC;AAC3E,WAAO,MAAM,kCAAkC,QAAQ,eAAe,MAAM,EAAE;AAC9E,YAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,EAC9B,CAAC;AACD,QAAM,GAAG,SAAS,CAAC,QAAe;AAMhC,WAAO,MAAM,wBAAwB,IAAI,OAAO,EAAE;AAClD,WAAO,GAAG;AAAA,EACZ,CAAC;AACD,QAAM,GAAG,WAAW,CAAC,YAAY;AAC/B,WAAO,MAAM,0BAA0B,OAAO,EAAE;AAAA,EAClD,CAAC;AACH,CAAC;AAKI,MAAM,oBAAoB;AAAA,EA+BvB,YACE,QACA,cACR;AAFQ;AACA;AAAA,EACP;AAAA,EAjCH,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,6BAAa,GAAG;AAAA,QACjB,CAAC,4BAAc,GAAG,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,SAAK,iBAAiB,QAAQ,MAAM;AAClC,eAAS,UAAU;AAAA,IACrB,CAAC;AAED,UAAM;AAEN,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU;AAAA,EAMlB,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
  }
@@ -2,6 +2,6 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/worker/is-child.ts"],
4
4
  "sourcesContent": ["export const CHILD_ENV_KEY = 'IS_CHILD'\nexport const CHILD_ENV_VALUE = 'true'\n\nexport type MainProcessProps = {\n type: 'main'\n pid: number\n}\nexport type ChildProcessProps = {\n type: 'child'\n sendMessage: (message: string) => void\n pid: number\n}\n\nexport type ProcessProps = MainProcessProps | ChildProcessProps\n\nconst getProcessProps = (): ProcessProps => {\n const type = process.env[CHILD_ENV_KEY] === CHILD_ENV_VALUE ? 'child' : 'main'\n if (type === 'main') {\n return {\n type,\n pid: process.pid,\n }\n }\n\n if (!process.send) {\n throw new Error(`Please do not use variable ${CHILD_ENV_KEY} manually`)\n }\n\n return {\n type,\n sendMessage: process.send,\n pid: process.pid,\n }\n}\n\nexport const processProps = getProcessProps()\nexport const isChildProcess = processProps.type === 'child'\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AAc/B,MAAM,kBAAkB,MAAoB;AAC1C,QAAM,OAAO,QAAQ,IAAI,aAAa,MAAM,kBAAkB,UAAU;AACxE,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,8BAA8B,wBAAwB;AAAA,EACxE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,KAAK,QAAQ;AAAA,EACf;AACF;AAEO,MAAM,eAAe,gBAAgB;AACrC,MAAM,iBAAiB,aAAa,SAAS;",
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,gBAAgB;AACtB,MAAM,kBAAkB;AAc/B,MAAM,kBAAkB,MAAoB;AAC1C,QAAM,OAAO,QAAQ,IAAI,aAAa,MAAM,kBAAkB,UAAU;AACxE,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,UAAM,IAAI,MAAM,8BAA8B,aAAa,WAAW;AAAA,EACxE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,KAAK,QAAQ;AAAA,EACf;AACF;AAEO,MAAM,eAAe,gBAAgB;AACrC,MAAM,iBAAiB,aAAa,SAAS;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "4.17.12",
3
+ "version": "4.17.14",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",
@@ -37,7 +37,7 @@
37
37
  "boxen": "5.1.2",
38
38
  "chalk": "^4.1.2",
39
39
  "dotenv": "^16.4.4",
40
- "esbuild": "^0.16.12",
40
+ "esbuild": "^0.25.10",
41
41
  "handlebars": "^4.7.8",
42
42
  "latest-version": "5.1.0",
43
43
  "lodash": "^4.17.21",