@botpress/cli 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +13 -13
- package/dist/api/bot-body.js +10 -5
- package/dist/api/bot-body.js.map +2 -2
- package/dist/api/integration-body.js +12 -6
- package/dist/api/integration-body.js.map +2 -2
- package/dist/api/interface-body.js +10 -5
- package/dist/api/interface-body.js.map +2 -2
- package/dist/api/plugin-body.js +10 -5
- package/dist/api/plugin-body.js.map +2 -2
- package/dist/code-generation/bot-implementation/index.js +9 -1
- package/dist/code-generation/bot-implementation/index.js.map +2 -2
- package/dist/code-generation/index.d.ts +1 -1
- package/dist/code-generation/index.js +2 -2
- package/dist/code-generation/index.js.map +2 -2
- package/dist/code-generation/integration-implementation/index.js +2 -2
- package/dist/code-generation/integration-implementation/index.js.map +2 -2
- package/dist/code-generation/secret-module.d.ts +12 -0
- package/dist/code-generation/{integration-implementation/integration-secret.js → secret-module.js} +13 -13
- package/dist/code-generation/secret-module.js.map +7 -0
- package/dist/command-definitions.d.ts +43 -0
- package/dist/command-definitions.js +4 -0
- package/dist/command-definitions.js.map +2 -2
- package/dist/command-implementations/deploy-command.js +1 -0
- package/dist/command-implementations/deploy-command.js.map +2 -2
- package/dist/command-implementations/dev-command.js +9 -9
- package/dist/command-implementations/dev-command.js.map +2 -2
- package/dist/command-implementations/index.d.ts +45 -0
- package/dist/command-implementations/index.js +2 -1
- package/dist/command-implementations/index.js.map +2 -2
- package/dist/command-implementations/profile-commands.d.ts +4 -0
- package/dist/command-implementations/profile-commands.js +31 -1
- package/dist/command-implementations/profile-commands.js.map +2 -2
- package/dist/command-implementations/project-command.d.ts +3 -1
- package/dist/command-implementations/project-command.js +7 -5
- package/dist/command-implementations/project-command.js.map +2 -2
- package/dist/command-implementations/serve-command.js +1 -1
- package/dist/command-implementations/serve-command.js.map +2 -2
- package/dist/config.d.ts +40 -0
- package/dist/config.js +12 -1
- package/dist/config.js.map +2 -2
- package/dist/index.d.ts +45 -0
- package/dist/index.js +2 -1
- package/dist/index.js.map +2 -2
- package/dist/linter/base-linter.test.js +4 -2
- package/dist/linter/base-linter.test.js.map +2 -2
- package/dist/linter/ruleset-tests/bot.ruleset.test.js +22 -0
- package/dist/linter/ruleset-tests/bot.ruleset.test.js.map +2 -2
- package/dist/linter/rulesets/bot.ruleset.js +3 -1
- package/dist/linter/rulesets/bot.ruleset.js.map +2 -2
- package/dist/linter/rulesets/integration.ruleset.js +2 -12
- package/dist/linter/rulesets/integration.ruleset.js.map +2 -2
- package/dist/linter/rulesets/shared-rules.d.ts +2 -0
- package/dist/linter/rulesets/shared-rules.js +41 -0
- package/dist/linter/rulesets/shared-rules.js.map +7 -0
- package/dist/utils/schema-utils.d.ts +1 -0
- package/dist/utils/schema-utils.js +5 -2
- package/dist/utils/schema-utils.js.map +2 -2
- package/package.json +3 -3
- package/templates/empty-bot/package.json +2 -2
- package/templates/empty-integration/package.json +2 -2
- package/templates/empty-plugin/package.json +1 -1
- package/templates/hello-world/package.json +2 -2
- package/templates/webhook-message/package.json +2 -2
- package/dist/code-generation/integration-implementation/integration-secret.d.ts +0 -9
- package/dist/code-generation/integration-implementation/integration-secret.js.map +0 -7
|
@@ -106,7 +106,8 @@ var command_implementations_default = {
|
|
|
106
106
|
subcommands: {
|
|
107
107
|
list: getHandler(profiles.ListProfilesCommand),
|
|
108
108
|
active: getHandler(profiles.ActiveProfileCommand),
|
|
109
|
-
use: getHandler(profiles.UseProfileCommand)
|
|
109
|
+
use: getHandler(profiles.UseProfileCommand),
|
|
110
|
+
get: getHandler(profiles.GetProfileCommand)
|
|
110
111
|
}
|
|
111
112
|
}
|
|
112
113
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { ApiClient } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport type { ImplementationTree } from '../command-tree'\nimport { Logger } from '../logger'\nimport type { CommandArgv } from '../typings'\nimport * as utils from '../utils'\nimport { AddCommand } from './add-command'\nimport type { BaseCommand } from './base-command'\nimport * as bots from './bot-commands'\nimport { BuildCommand } from './build-command'\nimport { BundleCommand } from './bundle-command'\nimport { ChatCommand } from './chat-command'\nimport { DeployCommand } from './deploy-command'\nimport { DevCommand } from './dev-command'\nimport { GenerateCommand } from './gen-command'\nimport type { GlobalCommand, GlobalCommandDefinition } from './global-command'\nimport { InitCommand } from './init-command'\nimport * as integrations from './integration-commands'\nimport * as interfaces from './interface-commands'\nimport { LintCommand } from './lint-command'\nimport { LoginCommand } from './login-command'\nimport { LogoutCommand } from './logout-command'\nimport * as plugins from './plugin-commands'\nimport * as profiles from './profile-commands'\nimport { ReadCommand } from './read-command'\nimport { RemoveCommand } from './remove-command'\nimport { ServeCommand } from './serve-command'\n\ntype GlobalCtor<C extends GlobalCommandDefinition> = new (\n ...args: ConstructorParameters<typeof GlobalCommand<C>>\n) => BaseCommand<C>\n\nconst getHandler =\n <C extends GlobalCommandDefinition>(cls: GlobalCtor<C>) =>\n async (argv: CommandArgv<C>) => {\n const logger = new Logger(argv)\n const prompt = new utils.prompt.CLIPrompt(argv, logger)\n return new cls(ApiClient, prompt, logger, argv).handler()\n }\n\nexport default {\n login: getHandler(LoginCommand),\n logout: getHandler(LogoutCommand),\n bots: {\n subcommands: {\n create: getHandler(bots.CreateBotCommand),\n get: getHandler(bots.GetBotCommand),\n delete: getHandler(bots.DeleteBotCommand),\n list: getHandler(bots.ListBotsCommand),\n },\n },\n integrations: {\n subcommands: {\n get: getHandler(integrations.GetIntegrationCommand),\n list: getHandler(integrations.ListIntegrationsCommand),\n delete: getHandler(integrations.DeleteIntegrationCommand),\n },\n },\n interfaces: {\n subcommands: {\n get: getHandler(interfaces.GetInterfaceCommand),\n list: getHandler(interfaces.ListInterfacesCommand),\n delete: getHandler(interfaces.DeleteInterfaceCommand),\n },\n },\n plugins: {\n subcommands: {\n get: getHandler(plugins.GetPluginCommand),\n list: getHandler(plugins.ListPluginsCommand),\n delete: getHandler(plugins.DeletePluginCommand),\n },\n },\n init: getHandler(InitCommand),\n generate: getHandler(GenerateCommand),\n bundle: getHandler(BundleCommand),\n build: getHandler(BuildCommand),\n read: getHandler(ReadCommand),\n serve: getHandler(ServeCommand),\n deploy: getHandler(DeployCommand),\n add: getHandler(AddCommand),\n remove: getHandler(RemoveCommand),\n dev: getHandler(DevCommand),\n lint: getHandler(LintCommand),\n chat: getHandler(ChatCommand),\n profiles: {\n subcommands: {\n list: getHandler(profiles.ListProfilesCommand),\n active: getHandler(profiles.ActiveProfileCommand),\n use: getHandler(profiles.UseProfileCommand),\n },\n },\n} satisfies ImplementationTree<typeof commandDefinitions>\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,oBAAuB;AAEvB,YAAuB;AACvB,yBAA2B;AAE3B,WAAsB;AACtB,2BAA6B;AAC7B,4BAA8B;AAC9B,0BAA4B;AAC5B,4BAA8B;AAC9B,yBAA2B;AAC3B,yBAAgC;AAEhC,0BAA4B;AAC5B,mBAA8B;AAC9B,iBAA4B;AAC5B,0BAA4B;AAC5B,2BAA6B;AAC7B,4BAA8B;AAC9B,cAAyB;AACzB,eAA0B;AAC1B,0BAA4B;AAC5B,4BAA8B;AAC9B,2BAA6B;AAM7B,MAAM,aACJ,CAAoC,QACpC,OAAO,SAAyB;AAC9B,QAAM,SAAS,IAAI,qBAAO,IAAI;AAC9B,QAAM,SAAS,IAAI,MAAM,OAAO,UAAU,MAAM,MAAM;AACtD,SAAO,IAAI,IAAI,yBAAW,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC1D;AAEF,IAAO,kCAAQ;AAAA,EACb,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,MAAM;AAAA,IACJ,aAAa;AAAA,MACX,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,KAAK,WAAW,KAAK,aAAa;AAAA,MAClC,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,MAAM,WAAW,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,aAAa;AAAA,MACX,KAAK,WAAW,aAAa,qBAAqB;AAAA,MAClD,MAAM,WAAW,aAAa,uBAAuB;AAAA,MACrD,QAAQ,WAAW,aAAa,wBAAwB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,MACX,KAAK,WAAW,WAAW,mBAAmB;AAAA,MAC9C,MAAM,WAAW,WAAW,qBAAqB;AAAA,MACjD,QAAQ,WAAW,WAAW,sBAAsB;AAAA,IACtD;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,MACX,KAAK,WAAW,QAAQ,gBAAgB;AAAA,MACxC,MAAM,WAAW,QAAQ,kBAAkB;AAAA,MAC3C,QAAQ,WAAW,QAAQ,mBAAmB;AAAA,IAChD;AAAA,EACF;AAAA,EACA,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU,WAAW,kCAAe;AAAA,EACpC,QAAQ,WAAW,mCAAa;AAAA,EAChC,OAAO,WAAW,iCAAY;AAAA,EAC9B,MAAM,WAAW,+BAAW;AAAA,EAC5B,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,MAAM,WAAW,+BAAW;AAAA,EAC5B,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU;AAAA,IACR,aAAa;AAAA,MACX,MAAM,WAAW,SAAS,mBAAmB;AAAA,MAC7C,QAAQ,WAAW,SAAS,oBAAoB;AAAA,MAChD,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAC5C;AAAA,EACF;AACF;",
|
|
4
|
+
"sourcesContent": ["import { ApiClient } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport type { ImplementationTree } from '../command-tree'\nimport { Logger } from '../logger'\nimport type { CommandArgv } from '../typings'\nimport * as utils from '../utils'\nimport { AddCommand } from './add-command'\nimport type { BaseCommand } from './base-command'\nimport * as bots from './bot-commands'\nimport { BuildCommand } from './build-command'\nimport { BundleCommand } from './bundle-command'\nimport { ChatCommand } from './chat-command'\nimport { DeployCommand } from './deploy-command'\nimport { DevCommand } from './dev-command'\nimport { GenerateCommand } from './gen-command'\nimport type { GlobalCommand, GlobalCommandDefinition } from './global-command'\nimport { InitCommand } from './init-command'\nimport * as integrations from './integration-commands'\nimport * as interfaces from './interface-commands'\nimport { LintCommand } from './lint-command'\nimport { LoginCommand } from './login-command'\nimport { LogoutCommand } from './logout-command'\nimport * as plugins from './plugin-commands'\nimport * as profiles from './profile-commands'\nimport { ReadCommand } from './read-command'\nimport { RemoveCommand } from './remove-command'\nimport { ServeCommand } from './serve-command'\n\ntype GlobalCtor<C extends GlobalCommandDefinition> = new (\n ...args: ConstructorParameters<typeof GlobalCommand<C>>\n) => BaseCommand<C>\n\nconst getHandler =\n <C extends GlobalCommandDefinition>(cls: GlobalCtor<C>) =>\n async (argv: CommandArgv<C>) => {\n const logger = new Logger(argv)\n const prompt = new utils.prompt.CLIPrompt(argv, logger)\n return new cls(ApiClient, prompt, logger, argv).handler()\n }\n\nexport default {\n login: getHandler(LoginCommand),\n logout: getHandler(LogoutCommand),\n bots: {\n subcommands: {\n create: getHandler(bots.CreateBotCommand),\n get: getHandler(bots.GetBotCommand),\n delete: getHandler(bots.DeleteBotCommand),\n list: getHandler(bots.ListBotsCommand),\n },\n },\n integrations: {\n subcommands: {\n get: getHandler(integrations.GetIntegrationCommand),\n list: getHandler(integrations.ListIntegrationsCommand),\n delete: getHandler(integrations.DeleteIntegrationCommand),\n },\n },\n interfaces: {\n subcommands: {\n get: getHandler(interfaces.GetInterfaceCommand),\n list: getHandler(interfaces.ListInterfacesCommand),\n delete: getHandler(interfaces.DeleteInterfaceCommand),\n },\n },\n plugins: {\n subcommands: {\n get: getHandler(plugins.GetPluginCommand),\n list: getHandler(plugins.ListPluginsCommand),\n delete: getHandler(plugins.DeletePluginCommand),\n },\n },\n init: getHandler(InitCommand),\n generate: getHandler(GenerateCommand),\n bundle: getHandler(BundleCommand),\n build: getHandler(BuildCommand),\n read: getHandler(ReadCommand),\n serve: getHandler(ServeCommand),\n deploy: getHandler(DeployCommand),\n add: getHandler(AddCommand),\n remove: getHandler(RemoveCommand),\n dev: getHandler(DevCommand),\n lint: getHandler(LintCommand),\n chat: getHandler(ChatCommand),\n profiles: {\n subcommands: {\n list: getHandler(profiles.ListProfilesCommand),\n active: getHandler(profiles.ActiveProfileCommand),\n use: getHandler(profiles.UseProfileCommand),\n get: getHandler(profiles.GetProfileCommand),\n },\n },\n} satisfies ImplementationTree<typeof commandDefinitions>\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA0B;AAG1B,oBAAuB;AAEvB,YAAuB;AACvB,yBAA2B;AAE3B,WAAsB;AACtB,2BAA6B;AAC7B,4BAA8B;AAC9B,0BAA4B;AAC5B,4BAA8B;AAC9B,yBAA2B;AAC3B,yBAAgC;AAEhC,0BAA4B;AAC5B,mBAA8B;AAC9B,iBAA4B;AAC5B,0BAA4B;AAC5B,2BAA6B;AAC7B,4BAA8B;AAC9B,cAAyB;AACzB,eAA0B;AAC1B,0BAA4B;AAC5B,4BAA8B;AAC9B,2BAA6B;AAM7B,MAAM,aACJ,CAAoC,QACpC,OAAO,SAAyB;AAC9B,QAAM,SAAS,IAAI,qBAAO,IAAI;AAC9B,QAAM,SAAS,IAAI,MAAM,OAAO,UAAU,MAAM,MAAM;AACtD,SAAO,IAAI,IAAI,yBAAW,QAAQ,QAAQ,IAAI,EAAE,QAAQ;AAC1D;AAEF,IAAO,kCAAQ;AAAA,EACb,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,MAAM;AAAA,IACJ,aAAa;AAAA,MACX,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,KAAK,WAAW,KAAK,aAAa;AAAA,MAClC,QAAQ,WAAW,KAAK,gBAAgB;AAAA,MACxC,MAAM,WAAW,KAAK,eAAe;AAAA,IACvC;AAAA,EACF;AAAA,EACA,cAAc;AAAA,IACZ,aAAa;AAAA,MACX,KAAK,WAAW,aAAa,qBAAqB;AAAA,MAClD,MAAM,WAAW,aAAa,uBAAuB;AAAA,MACrD,QAAQ,WAAW,aAAa,wBAAwB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,MACX,KAAK,WAAW,WAAW,mBAAmB;AAAA,MAC9C,MAAM,WAAW,WAAW,qBAAqB;AAAA,MACjD,QAAQ,WAAW,WAAW,sBAAsB;AAAA,IACtD;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,aAAa;AAAA,MACX,KAAK,WAAW,QAAQ,gBAAgB;AAAA,MACxC,MAAM,WAAW,QAAQ,kBAAkB;AAAA,MAC3C,QAAQ,WAAW,QAAQ,mBAAmB;AAAA,IAChD;AAAA,EACF;AAAA,EACA,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU,WAAW,kCAAe;AAAA,EACpC,QAAQ,WAAW,mCAAa;AAAA,EAChC,OAAO,WAAW,iCAAY;AAAA,EAC9B,MAAM,WAAW,+BAAW;AAAA,EAC5B,OAAO,WAAW,iCAAY;AAAA,EAC9B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,QAAQ,WAAW,mCAAa;AAAA,EAChC,KAAK,WAAW,6BAAU;AAAA,EAC1B,MAAM,WAAW,+BAAW;AAAA,EAC5B,MAAM,WAAW,+BAAW;AAAA,EAC5B,UAAU;AAAA,IACR,aAAa;AAAA,MACX,MAAM,WAAW,SAAS,mBAAmB;AAAA,MAC7C,QAAQ,WAAW,SAAS,oBAAoB;AAAA,MAChD,KAAK,WAAW,SAAS,iBAAiB;AAAA,MAC1C,KAAK,WAAW,SAAS,iBAAiB;AAAA,IAC5C;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -12,3 +12,7 @@ export type UseProfileCommandDefinition = typeof commandDefinitions.profiles.sub
|
|
|
12
12
|
export declare class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {
|
|
13
13
|
run(): Promise<void>;
|
|
14
14
|
}
|
|
15
|
+
export type GetProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.get;
|
|
16
|
+
export declare class GetProfileCommand extends GlobalCommand<GetProfileCommandDefinition> {
|
|
17
|
+
run(): Promise<void>;
|
|
18
|
+
}
|
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
var profile_commands_exports = {};
|
|
30
30
|
__export(profile_commands_exports, {
|
|
31
31
|
ActiveProfileCommand: () => ActiveProfileCommand,
|
|
32
|
+
GetProfileCommand: () => GetProfileCommand,
|
|
32
33
|
ListProfilesCommand: () => ListProfilesCommand,
|
|
33
34
|
UseProfileCommand: () => UseProfileCommand
|
|
34
35
|
});
|
|
@@ -78,7 +79,7 @@ class UseProfileCommand extends import_global_command.GlobalCommand {
|
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
const profiles = await this.readProfilesFromFS();
|
|
81
|
-
const choices = Object.
|
|
82
|
+
const choices = Object.keys(profiles).map((profileName) => ({
|
|
82
83
|
title: profileName,
|
|
83
84
|
description: "",
|
|
84
85
|
value: profileName
|
|
@@ -95,6 +96,34 @@ class UseProfileCommand extends import_global_command.GlobalCommand {
|
|
|
95
96
|
logSuccess(selectedProfile);
|
|
96
97
|
}
|
|
97
98
|
}
|
|
99
|
+
class GetProfileCommand extends import_global_command.GlobalCommand {
|
|
100
|
+
async run() {
|
|
101
|
+
const logResult = (profileEntry) => {
|
|
102
|
+
const profile2 = _shouldOmitToken(this.argv) ? _stripProfileToken(profileEntry) : profileEntry;
|
|
103
|
+
this.logger.log("Profile:");
|
|
104
|
+
this.logger.json(profile2);
|
|
105
|
+
};
|
|
106
|
+
if (this.argv.profileToGet) {
|
|
107
|
+
const profile2 = await this.readProfileFromFS(this.argv.profileToGet);
|
|
108
|
+
logResult({ name: this.argv.profileToGet, ...profile2 });
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const profiles = await this.readProfilesFromFS();
|
|
112
|
+
const choices = Object.keys(profiles).map((profileName) => ({
|
|
113
|
+
title: profileName,
|
|
114
|
+
description: "",
|
|
115
|
+
value: profileName
|
|
116
|
+
}));
|
|
117
|
+
const selectedProfile = await this.prompt.select("Select the profile you want to get.", { choices });
|
|
118
|
+
if (!selectedProfile) {
|
|
119
|
+
this.logger.log("No profile selected, aborting.");
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const profile = profiles[selectedProfile];
|
|
123
|
+
if (!profile) throw new errors.BotpressCLIError("The selected profile could not be read");
|
|
124
|
+
logResult({ name: selectedProfile, ...profile });
|
|
125
|
+
}
|
|
126
|
+
}
|
|
98
127
|
const _updateGlobalCache = async (props) => {
|
|
99
128
|
await props.globalCache.set("activeProfile", props.profileName);
|
|
100
129
|
await props.globalCache.set("apiUrl", props.profile.apiUrl);
|
|
@@ -110,6 +139,7 @@ const _shouldOmitToken = (argv) => !argv.displayToken;
|
|
|
110
139
|
// Annotate the CommonJS export names for ESM import in node:
|
|
111
140
|
0 && (module.exports = {
|
|
112
141
|
ActiveProfileCommand,
|
|
142
|
+
GetProfileCommand,
|
|
113
143
|
ListProfilesCommand,
|
|
114
144
|
UseProfileCommand
|
|
115
145
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/profile-commands.ts"],
|
|
4
|
-
"sourcesContent": ["import chalk from 'chalk'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCache, GlobalCommand, ProfileCredentials } from './global-command'\n\ntype ProfileEntry = ProfileCredentials & {\n name: string\n}\n\ntype ProfileEntryWithoutToken = Omit<ProfileEntry, 'token'>\n\nexport type ActiveProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.active\nexport class ActiveProfileCommand extends GlobalCommand<ActiveProfileCommandDefinition> {\n public async run(): Promise<void> {\n let activeProfileName = await this.globalCache.get('activeProfile')\n\n if (!activeProfileName) {\n this.logger.debug(`No active profile set, defaulting to ${consts.defaultProfileName}`)\n activeProfileName = consts.defaultProfileName\n await this.globalCache.set('activeProfile', activeProfileName)\n }\n\n const profile = await this.readProfileFromFS(activeProfileName)\n let profileEntry: ProfileEntry | ProfileEntryWithoutToken = { name: activeProfileName, ...profile }\n if (_shouldOmitToken(this.argv)) profileEntry = _stripProfileToken(profileEntry)\n\n this.logger.log('Active profile:')\n this.logger.json(profileEntry)\n }\n}\n\nexport type ListProfilesCommandDefinition = typeof commandDefinitions.profiles.subcommands.list\nexport class ListProfilesCommand extends GlobalCommand<ListProfilesCommandDefinition> {\n public async run(): Promise<void> {\n const profiles = await this.readProfilesFromFS()\n const profileEntries: ProfileEntry[] = Object.entries(profiles).map(([name, profile]) => ({ name, ...profile }))\n if (!profileEntries.length) {\n this.logger.log('No profiles found')\n return\n }\n const activeProfileName = await this.globalCache.get('activeProfile')\n const activeProfileMsg = `Active profile: '${chalk.bold(chalk.cyanBright(activeProfileName))}'`\n\n this.logger.log(activeProfileMsg)\n this.logger.json(!_shouldOmitToken(this.argv) ? profileEntries : profileEntries.map(_stripProfileToken))\n this.logger.log(activeProfileMsg)\n }\n}\n\nexport type UseProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.use\nexport class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logSuccess = (profileName: string) => this.logger.success(`Now using profile \"${profileName}\"`)\n\n if (this.argv.profileToUse) {\n const profile = await this.readProfileFromFS(this.argv.profileToUse)\n await this.globalCache.set('activeProfile', this.argv.profileToUse)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: this.argv.profileToUse, profile })\n logSuccess(this.argv.profileToUse)\n return\n }\n const profiles = await this.readProfilesFromFS()\n const choices = Object.
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAElB,aAAwB;AACxB,aAAwB;AAExB,4BAA+D;AASxD,MAAM,6BAA6B,oCAA8C;AAAA,EACtF,MAAa,MAAqB;AAChC,QAAI,oBAAoB,MAAM,KAAK,YAAY,IAAI,eAAe;AAElE,QAAI,CAAC,mBAAmB;AACtB,WAAK,OAAO,MAAM,wCAAwC,OAAO,kBAAkB,EAAE;AACrF,0BAAoB,OAAO;AAC3B,YAAM,KAAK,YAAY,IAAI,iBAAiB,iBAAiB;AAAA,IAC/D;AAEA,UAAM,UAAU,MAAM,KAAK,kBAAkB,iBAAiB;AAC9D,QAAI,eAAwD,EAAE,MAAM,mBAAmB,GAAG,QAAQ;AAClG,QAAI,iBAAiB,KAAK,IAAI,EAAG,gBAAe,mBAAmB,YAAY;AAE/E,SAAK,OAAO,IAAI,iBAAiB;AACjC,SAAK,OAAO,KAAK,YAAY;AAAA,EAC/B;AACF;AAGO,MAAM,4BAA4B,oCAA6C;AAAA,EACpF,MAAa,MAAqB;AAChC,UAAM,WAAW,MAAM,KAAK,mBAAmB;AAC/C,UAAM,iBAAiC,OAAO,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;AAC/G,QAAI,CAAC,eAAe,QAAQ;AAC1B,WAAK,OAAO,IAAI,mBAAmB;AACnC;AAAA,IACF;AACA,UAAM,oBAAoB,MAAM,KAAK,YAAY,IAAI,eAAe;AACpE,UAAM,mBAAmB,oBAAoB,aAAAA,QAAM,KAAK,aAAAA,QAAM,WAAW,iBAAiB,CAAC,CAAC;AAE5F,SAAK,OAAO,IAAI,gBAAgB;AAChC,SAAK,OAAO,KAAK,CAAC,iBAAiB,KAAK,IAAI,IAAI,iBAAiB,eAAe,IAAI,kBAAkB,CAAC;AACvG,SAAK,OAAO,IAAI,gBAAgB;AAAA,EAClC;AACF;AAGO,MAAM,0BAA0B,oCAA2C;AAAA,EAChF,MAAa,MAAqB;AAChC,UAAM,aAAa,CAAC,gBAAwB,KAAK,OAAO,QAAQ,sBAAsB,WAAW,GAAG;AAEpG,QAAI,KAAK,KAAK,cAAc;AAC1B,YAAMC,WAAU,MAAM,KAAK,kBAAkB,KAAK,KAAK,YAAY;AACnE,YAAM,KAAK,YAAY,IAAI,iBAAiB,KAAK,KAAK,YAAY;AAClE,YAAM,mBAAmB,EAAE,aAAa,KAAK,aAAa,aAAa,KAAK,KAAK,cAAc,SAAAA,SAAQ,CAAC;AACxG,iBAAW,KAAK,KAAK,YAAY;AACjC;AAAA,IACF;AACA,UAAM,WAAW,MAAM,KAAK,mBAAmB;AAC/C,UAAM,UAAU,OAAO,
|
|
4
|
+
"sourcesContent": ["import chalk from 'chalk'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { GlobalCache, GlobalCommand, ProfileCredentials } from './global-command'\n\ntype ProfileEntry = ProfileCredentials & {\n name: string\n}\n\ntype ProfileEntryWithoutToken = Omit<ProfileEntry, 'token'>\n\nexport type ActiveProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.active\nexport class ActiveProfileCommand extends GlobalCommand<ActiveProfileCommandDefinition> {\n public async run(): Promise<void> {\n let activeProfileName = await this.globalCache.get('activeProfile')\n\n if (!activeProfileName) {\n this.logger.debug(`No active profile set, defaulting to ${consts.defaultProfileName}`)\n activeProfileName = consts.defaultProfileName\n await this.globalCache.set('activeProfile', activeProfileName)\n }\n\n const profile = await this.readProfileFromFS(activeProfileName)\n let profileEntry: ProfileEntry | ProfileEntryWithoutToken = { name: activeProfileName, ...profile }\n if (_shouldOmitToken(this.argv)) profileEntry = _stripProfileToken(profileEntry)\n\n this.logger.log('Active profile:')\n this.logger.json(profileEntry)\n }\n}\n\nexport type ListProfilesCommandDefinition = typeof commandDefinitions.profiles.subcommands.list\nexport class ListProfilesCommand extends GlobalCommand<ListProfilesCommandDefinition> {\n public async run(): Promise<void> {\n const profiles = await this.readProfilesFromFS()\n const profileEntries: ProfileEntry[] = Object.entries(profiles).map(([name, profile]) => ({ name, ...profile }))\n if (!profileEntries.length) {\n this.logger.log('No profiles found')\n return\n }\n const activeProfileName = await this.globalCache.get('activeProfile')\n const activeProfileMsg = `Active profile: '${chalk.bold(chalk.cyanBright(activeProfileName))}'`\n\n this.logger.log(activeProfileMsg)\n this.logger.json(!_shouldOmitToken(this.argv) ? profileEntries : profileEntries.map(_stripProfileToken))\n this.logger.log(activeProfileMsg)\n }\n}\n\nexport type UseProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.use\nexport class UseProfileCommand extends GlobalCommand<UseProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logSuccess = (profileName: string) => this.logger.success(`Now using profile \"${profileName}\"`)\n\n if (this.argv.profileToUse) {\n const profile = await this.readProfileFromFS(this.argv.profileToUse)\n await this.globalCache.set('activeProfile', this.argv.profileToUse)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: this.argv.profileToUse, profile })\n logSuccess(this.argv.profileToUse)\n return\n }\n const profiles = await this.readProfilesFromFS()\n const choices = Object.keys(profiles).map((profileName) => ({\n title: profileName,\n description: '',\n value: profileName,\n }))\n const selectedProfile = await this.prompt.select('Select the profile you want to use.', { choices })\n\n if (!selectedProfile) {\n this.logger.log('No profile selected, aborting.')\n return\n }\n\n const profile = profiles[selectedProfile]\n if (!profile) throw new errors.BotpressCLIError('The selected profile could not be read')\n await this.globalCache.set('activeProfile', selectedProfile)\n await _updateGlobalCache({ globalCache: this.globalCache, profileName: selectedProfile, profile })\n logSuccess(selectedProfile)\n }\n}\n\nexport type GetProfileCommandDefinition = typeof commandDefinitions.profiles.subcommands.get\nexport class GetProfileCommand extends GlobalCommand<GetProfileCommandDefinition> {\n public async run(): Promise<void> {\n const logResult = (profileEntry: ProfileEntry) => {\n const profile = _shouldOmitToken(this.argv) ? _stripProfileToken(profileEntry) : profileEntry\n this.logger.log('Profile:')\n this.logger.json(profile)\n }\n\n if (this.argv.profileToGet) {\n const profile = await this.readProfileFromFS(this.argv.profileToGet)\n logResult({ name: this.argv.profileToGet, ...profile })\n return\n }\n\n const profiles = await this.readProfilesFromFS()\n const choices = Object.keys(profiles).map((profileName) => ({\n title: profileName,\n description: '',\n value: profileName,\n }))\n const selectedProfile = await this.prompt.select('Select the profile you want to get.', { choices })\n\n if (!selectedProfile) {\n this.logger.log('No profile selected, aborting.')\n return\n }\n\n const profile = profiles[selectedProfile]\n if (!profile) throw new errors.BotpressCLIError('The selected profile could not be read')\n logResult({ name: selectedProfile, ...profile })\n }\n}\n\nconst _updateGlobalCache = async (props: {\n globalCache: utils.cache.FSKeyValueCache<GlobalCache>\n profileName: string\n profile: ProfileCredentials\n}): Promise<void> => {\n await props.globalCache.set('activeProfile', props.profileName)\n await props.globalCache.set('apiUrl', props.profile.apiUrl)\n await props.globalCache.set('token', props.profile.token)\n await props.globalCache.set('workspaceId', props.profile.workspaceId)\n}\n\nconst _stripProfileToken = (profile: ProfileEntry | ProfileEntryWithoutToken): ProfileEntryWithoutToken => ({\n name: profile.name,\n apiUrl: profile.apiUrl,\n workspaceId: profile.workspaceId,\n})\n\nconst _shouldOmitToken = (argv: { displayToken: boolean }) => !argv.displayToken\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["chalk", "profile"]
|
|
7
7
|
}
|
|
@@ -99,7 +99,9 @@ export declare abstract class ProjectCommand<C extends ProjectCommandDefinition>
|
|
|
99
99
|
private _getAuthorizationLink;
|
|
100
100
|
private _getSandboxLink;
|
|
101
101
|
private _displaySandboxLinkAndCode;
|
|
102
|
-
protected promptSecrets(
|
|
102
|
+
protected promptSecrets(def: {
|
|
103
|
+
secrets?: Record<string, sdk.SecretDefinition>;
|
|
104
|
+
}, argv: YargsConfig<typeof config.schemas.secrets>, opts?: {
|
|
103
105
|
formatEnv?: boolean;
|
|
104
106
|
knownSecrets?: string[];
|
|
105
107
|
}): Promise<Record<string, string | null>>;
|
|
@@ -363,17 +363,17 @@ class ProjectCommand extends import_global_command.GlobalCommand {
|
|
|
363
363
|
});
|
|
364
364
|
}
|
|
365
365
|
}
|
|
366
|
-
async promptSecrets(
|
|
366
|
+
async promptSecrets(def, argv, opts = {}) {
|
|
367
367
|
const formatEnv = opts.formatEnv ?? false;
|
|
368
368
|
const knownSecrets = opts.knownSecrets ?? [];
|
|
369
|
-
const { secrets: secretDefinitions } =
|
|
369
|
+
const { secrets: secretDefinitions } = def;
|
|
370
370
|
if (!secretDefinitions) {
|
|
371
371
|
return {};
|
|
372
372
|
}
|
|
373
373
|
const secretArgv = this._parseArgvSecrets(argv.secrets);
|
|
374
374
|
const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s]);
|
|
375
375
|
if (invalidSecret) {
|
|
376
|
-
throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in
|
|
376
|
+
throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in the definition`);
|
|
377
377
|
}
|
|
378
378
|
const values = {};
|
|
379
379
|
for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {
|
|
@@ -443,7 +443,8 @@ class ProjectCommand extends import_global_command.GlobalCommand {
|
|
|
443
443
|
},
|
|
444
444
|
configuration: integrationDef.configuration ? {
|
|
445
445
|
schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {
|
|
446
|
-
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer
|
|
446
|
+
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
|
|
447
|
+
toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
|
|
447
448
|
}),
|
|
448
449
|
identifier: {
|
|
449
450
|
required: integrationDef.configuration.identifier?.required,
|
|
@@ -456,7 +457,8 @@ class ProjectCommand extends import_global_command.GlobalCommand {
|
|
|
456
457
|
title: configuration.title,
|
|
457
458
|
description: configuration.description,
|
|
458
459
|
schema: await utils.schema.mapZodToJsonSchema(configuration, {
|
|
459
|
-
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer
|
|
460
|
+
useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,
|
|
461
|
+
toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions
|
|
460
462
|
}),
|
|
461
463
|
identifier: {
|
|
462
464
|
required: configuration.identifier?.required,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/project-command.ts"],
|
|
4
|
-
"sourcesContent": ["import type * as client from '@botpress/client'\nimport type * as sdk from '@botpress/sdk'\nimport type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport { validateIntegrationDefinition, validateBotDefinition } from '../sdk'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nexport type ProjectCommandDefinition = CommandDefinition<typeof config.schemas.project>\nexport type ProjectCache = {\n botId: string\n devId: string\n tunnelId: string\n secrets: {\n [secretName: string]: string\n }\n}\n\ntype ConfigurableProjectPaths = { workDir: string }\ntype ConstantProjectPaths = typeof consts.fromWorkDir\ntype AllProjectPaths = ConfigurableProjectPaths & ConstantProjectPaths\n\ntype LintIgnoredConfig = { bpLintDisabled?: boolean }\n\nexport type ProjectType = ProjectDefinition['type']\nexport type ProjectDefinition = LintIgnoredConfig &\n (\n | { type: 'integration'; definition: sdk.IntegrationDefinition }\n | { type: 'interface'; definition: sdk.InterfaceDefinition }\n | { type: 'bot'; definition: sdk.BotDefinition }\n | { type: 'plugin'; definition: sdk.PluginDefinition }\n )\n\ntype ProjectDefinitionResolver<T> = () => Promise<LintIgnoredConfig & T>\n\nexport type ProjectDefinitionLazy =\n | {\n projectType: 'integration'\n resolveProjectDefinition: ProjectDefinitionResolver<{\n type: 'integration'\n definition: sdk.IntegrationDefinition\n }>\n }\n | {\n projectType: 'bot'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'bot'; definition: sdk.BotDefinition }>\n }\n | {\n projectType: 'interface'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'interface'; definition: sdk.InterfaceDefinition }>\n }\n | {\n projectType: 'plugin'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'plugin'; definition: sdk.PluginDefinition }>\n }\n\ntype UpdatedBot = client.Bot\n\ntype ClientIntegrationDefinitions = Record<string, client.Integration>\ntype ClientIntegration = client.Bot['integrations'][string]\n\nclass ProjectPaths extends utils.path.PathStore<keyof AllProjectPaths> {\n public constructor(argv: CommandArgv<ProjectCommandDefinition>) {\n const absWorkDir = utils.path.absoluteFrom(utils.path.cwd(), argv.workDir)\n super({\n workDir: absWorkDir,\n ..._.mapValues(consts.fromWorkDir, (p) => utils.path.absoluteFrom(absWorkDir, p)),\n })\n }\n}\n\nexport class ProjectDefinitionContext {\n private _codeCache: Map<string, object> = new Map()\n private _buildContext: utils.esbuild.BuildEntrypointContext = new utils.esbuild.BuildEntrypointContext()\n\n public getOrResolveDefinition<T extends object>(code: string): T {\n const definition = this._codeCache.get(code)\n if (definition) {\n return definition as T\n }\n const result = utils.require.requireJsCode<{ default: object }>(code)\n this._codeCache.set(code, result.default)\n return result.default as T\n }\n\n public rebuildEntrypoint(...args: Parameters<utils.esbuild.BuildEntrypointContext['rebuild']>) {\n return this._buildContext.rebuild(...args)\n }\n}\n\ntype ResolvedDependency = { id: string }\ntype DependencyCacheKey = `${'integration' | 'plugin' | 'interface'}:${string}@${string}`\n\nexport abstract class ProjectCommand<C extends ProjectCommandDefinition> extends GlobalCommand<C> {\n protected projectContext: ProjectDefinitionContext = new ProjectDefinitionContext()\n private _dependencyCache = new Map<DependencyCacheKey, ResolvedDependency>()\n\n public setProjectContext(projectContext: ProjectDefinitionContext) {\n this.projectContext = projectContext\n return this\n }\n\n protected override async bootstrap() {\n await super.bootstrap()\n await this._notifyUpdateSdk()\n }\n\n protected get projectPaths() {\n return new ProjectPaths(this.argv)\n }\n\n protected get projectCache() {\n return new utils.cache.FSKeyValueCache<ProjectCache>(this.projectPaths.abs.projectCacheFile)\n }\n\n private _readProjectType(projectPaths: ProjectPaths): ProjectType {\n const abs = projectPaths.abs\n if (fs.existsSync(abs.integrationDefinition)) {\n return 'integration'\n }\n if (fs.existsSync(abs.interfaceDefinition)) {\n return 'interface'\n }\n if (fs.existsSync(abs.botDefinition)) {\n return 'bot'\n }\n if (fs.existsSync(abs.pluginDefinition)) {\n return 'plugin'\n }\n throw new errors.UnsupportedProjectType()\n }\n\n protected readProjectDefinitionFromFS(): ProjectDefinitionLazy {\n try {\n const type = this._readProjectType(this.projectPaths)\n if (type === 'integration') {\n return {\n projectType: 'integration',\n resolveProjectDefinition: async () => ({\n type: 'integration',\n ...(await this._readIntegrationDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'plugin') {\n return {\n projectType: 'plugin',\n resolveProjectDefinition: async () => ({\n type: 'plugin',\n ...(await this._readPluginDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'interface') {\n return {\n projectType: 'interface',\n resolveProjectDefinition: async () => ({\n type: 'interface',\n ...(await this._readInterfaceDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'bot') {\n return {\n projectType: 'bot',\n resolveProjectDefinition: async () => ({\n type: 'bot',\n ...(await this._readBotDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n } catch (thrown: unknown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Error while reading project definition')\n }\n throw new errors.ProjectDefinitionNotFoundError(this.projectPaths.abs.workDir)\n }\n\n private async _readIntegrationDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'integrationDefinition'>\n ): Promise<{ definition: sdk.IntegrationDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.integrationDefinition)) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.integrationDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.integrationDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.IntegrationDefinition>(artifact.text)\n validateIntegrationDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readInterfaceDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'interfaceDefinition'>\n ): Promise<{ definition: sdk.InterfaceDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.interfaceDefinition)) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.interfaceDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.interfaceDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.InterfaceDefinition>(artifact.text)\n\n return { definition, bpLintDisabled }\n }\n\n private async _readBotDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'botDefinition'>\n ): Promise<{ definition: sdk.BotDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.botDefinition)) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.botDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.botDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.BotDefinition>(artifact.text)\n validateBotDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readPluginDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'pluginDefinition'>\n ): Promise<{ definition: sdk.PluginDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.pluginDefinition)) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.pluginDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.pluginDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.PluginDefinition>(artifact.text)\n // TODO: validate plugin definition\n return { definition, bpLintDisabled }\n }\n\n private async _isBpLintDisabled(definitionPath: string): Promise<boolean> {\n const tsContent = await fs.promises.readFile(definitionPath, 'utf-8')\n const regex = /\\/\\* bplint-disable \\*\\//\n return regex.test(tsContent)\n }\n\n protected async displayIntegrationUrls({ api, bot }: { api: apiUtils.ApiClient; bot: client.Bot }) {\n if (!_.keys(bot.integrations).length) {\n this.logger.debug('No integrations in bot')\n return\n }\n\n const integrationDefinitions = await utils.records.mapValuesAsync(bot.integrations, async (integration) =>\n api.getPublicOrPrivateIntegration({\n type: 'id',\n id: integration.id,\n })\n )\n\n this.logger.log('Integrations:')\n for (const [alias, integration] of Object.entries(bot.integrations)) {\n if (integration.enabled) {\n this.logger.log(`${alias} ${integration.version}:`, { prefix: { symbol: '\u2192', indent: 2 } })\n } else {\n this.logger.log(`${alias} ${integration.version} ${chalk.italic('(disabled)')}:`, {\n prefix: { symbol: '\u2192', indent: 2 },\n })\n }\n\n const integrationDefinition = integrationDefinitions[alias]\n const linkTemplateScript = integrationDefinition\n ? this._getLinkTemplateScript({ integration, integrationDefinition })\n : undefined\n this._displayWebhookUrl({ integration, integrationDefinition, linkTemplateScript })\n if (!integrationDefinition) {\n this.logger.debug(\n `No integration definition for integration ${alias} (${integration.name}, ${integration.id}), skipping OAuth or Sandbox links`\n )\n this.logger.line().commit()\n continue\n }\n const isSandbox =\n integration.configurationType === 'sandbox' && !!integrationDefinition.sandbox?.identifierExtractScript\n const showLink = !!linkTemplateScript && (isSandbox || !!integrationDefinition.identifier?.extractScript)\n if (showLink && isSandbox) {\n await this._displaySandboxLinkAndCode({ integration, alias, bot, api, linkTemplateScript })\n } else if (showLink) {\n this._displayAuthorizationLink({ integration, api, linkTemplateScript })\n }\n this.logger.line().commit()\n }\n }\n\n private _getLinkTemplateScript({\n integration,\n integrationDefinition,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n }) {\n const config =\n integration.configurationType === null\n ? integrationDefinition?.configuration\n : integrationDefinition?.configurations[integration.configurationType]\n return config?.identifier?.linkTemplateScript\n }\n\n private _displayWebhookUrl({\n integration,\n integrationDefinition,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n linkTemplateScript?: string\n }) {\n const needsWebhook = !(integrationDefinition?.identifier && linkTemplateScript)\n const logFn = (needsWebhook ? this.logger.log : this.logger.debug).bind(this.logger)\n\n if (integration.enabled) {\n logFn(`${chalk.bold('Webhook')}: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n logFn(`Webhook: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _displayAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const authorizationLink = this._getAuthorizationLink({ integration, api, linkTemplateScript })\n const isAuthorized = !!integration.identifier\n const authorizationStatus = integration.identifier ? 'Authorized \u2713' : 'Authorize'\n if (integration.enabled && isAuthorized) {\n this.logger.log(`${chalk.bold(authorizationStatus)} : ${authorizationLink}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`${authorizationStatus}: ${authorizationLink}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _getLinkTemplateArgs({ integration, api }: { integration: ClientIntegration; api: apiUtils.ApiClient }) {\n // These are the values used by the studio\n let env: 'development' | 'preview' | 'production'\n if (api.url.includes(consts.stagingBotpressDomain)) {\n env = 'preview'\n } else if (api.url.includes(consts.productionBotpressDomain)) {\n env = 'production'\n } else {\n env = 'development'\n }\n return {\n env,\n webhookId: integration.webhookId,\n webhookUrl: api.url.replace('api', 'webhook'),\n }\n }\n\n private _getAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: client.Bot['integrations'][string]\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: this._getLinkTemplateArgs({ integration, api }),\n })\n }\n\n private _getSandboxLink({\n shareableId,\n integration,\n api,\n linkTemplateScript,\n }: {\n shareableId: string\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: { shareableId, ...this._getLinkTemplateArgs({ integration, api }) },\n })\n }\n\n private async _displaySandboxLinkAndCode({\n integration,\n alias,\n bot,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n alias: string\n bot: client.Bot\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const shareableId = await api.getOrGenerateShareableId(bot.id, integration.id, alias)\n const sandboxLink = this._getSandboxLink({ shareableId, integration, api, linkTemplateScript })\n const sandboxInstruction = `Send '${shareableId}' to ${sandboxLink}`\n if (integration.enabled) {\n this.logger.log(`${chalk.bold('Sandbox')}: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`Sandbox: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n protected async promptSecrets(\n integrationDef: sdk.IntegrationDefinition,\n argv: YargsConfig<typeof config.schemas.secrets>,\n opts: { formatEnv?: boolean; knownSecrets?: string[] } = {}\n ): Promise<Record<string, string | null>> {\n const formatEnv = opts.formatEnv ?? false\n const knownSecrets = opts.knownSecrets ?? []\n\n const { secrets: secretDefinitions } = integrationDef\n if (!secretDefinitions) {\n return {}\n }\n\n const secretArgv = this._parseArgvSecrets(argv.secrets)\n const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s])\n if (invalidSecret) {\n throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in integration definition`)\n }\n\n const values: Record<string, string | null> = {}\n for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {\n const argvSecret = secretArgv[secretName]\n if (argvSecret) {\n this.logger.debug(`Using secret \"${secretName}\" from argv`)\n values[secretName] = argvSecret\n continue\n }\n\n const alreadyKnown = knownSecrets.includes(secretName)\n let mode: string\n if (alreadyKnown) {\n mode = 'already set'\n } else if (optional) {\n mode = 'optional'\n } else {\n mode = 'required'\n }\n\n const prompted = await this.prompt.text(`Enter value for secret \"${secretName}\" (${mode})`)\n if (prompted) {\n values[secretName] = prompted\n continue\n }\n\n if (alreadyKnown) {\n this.logger.log(`Secret \"${secretName}\" is unchanged`)\n } else if (optional) {\n this.logger.warn(`Secret \"${secretName}\" is unassigned`)\n } else {\n throw new errors.BotpressCLIError(`Secret \"${secretName}\" is required`)\n }\n }\n\n for (const secretName of knownSecrets) {\n const isDefined = secretName in secretDefinitions\n if (isDefined) {\n continue\n }\n const prompted = await this.prompt.confirm(`Secret \"${secretName}\" was removed. Do you wish to delete it?`)\n if (prompted) {\n this.logger.log(`Deleting secret \"${secretName}\"`, { prefix: { symbol: '\u00D7', fg: 'red' } })\n values[secretName] = null\n }\n }\n\n if (!formatEnv) {\n return values\n }\n\n const envVariables = _.mapKeys(values, (_v, k) => codegen.secretEnvVariableName(k))\n return envVariables\n }\n\n protected async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n const partialBody = await apiUtils.prepareCreateIntegrationBody(integrationDef)\n\n let code: string | undefined = undefined\n if (fs.existsSync(this.projectPaths.abs.outFileCJS)) {\n code = await this.readProjectFile(this.projectPaths.abs.outFileCJS)\n }\n\n const icon = await this.readProjectFile(integrationDef.icon, 'base64')\n const readme = await this.readProjectFile(integrationDef.readme, 'base64')\n const extractScript = await this.readProjectFile(integrationDef.identifier?.extractScript)\n const fallbackHandlerScript = await this.readProjectFile(integrationDef.identifier?.fallbackHandlerScript)\n return {\n ...partialBody,\n code,\n icon,\n readme,\n identifier: {\n extractScript,\n fallbackHandlerScript,\n },\n configuration: integrationDef.configuration\n ? {\n schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n }),\n identifier: {\n required: integrationDef.configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(\n integrationDef.configuration.identifier?.linkTemplateScript\n ),\n },\n }\n : undefined,\n configurations: integrationDef.configurations\n ? await utils.records.mapValuesAsync(integrationDef.configurations, async (configuration) => ({\n title: configuration.title,\n description: configuration.description,\n schema: await utils.schema.mapZodToJsonSchema(configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n }),\n identifier: {\n required: configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(configuration.identifier?.linkTemplateScript),\n },\n }))\n : undefined,\n }\n }\n\n protected async prepareBotDependencies(\n botDef: sdk.BotDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.UpdateBotRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: botDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n })\n\n const plugins = await this._fetchDependencies({\n deps: botDef.plugins ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivatePlugin({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `plugin:${name}@${version}`,\n })\n\n const pluginsWithBackingIntegrations = await utils.records.mapValuesAsync(plugins, async (plugin) => ({\n ...plugin,\n interfaces: await this._fetchDependencies({\n deps: plugin.interfaces ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `interface:${name}@${version}`,\n }),\n integrations: await this._fetchDependencies({\n deps: plugin.integrations ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n }),\n }))\n\n return {\n integrations: utils.records.mapValues(\n integrations,\n ({ enabled, configurationType, configuration, disabledChannels, id }) =>\n ({\n enabled,\n configurationType,\n configuration,\n disabledChannels,\n integrationId: id,\n }) satisfies NonNullable<apiUtils.UpdateBotRequestBody['integrations']>[string]\n ),\n plugins: utils.records.mapValues(pluginsWithBackingIntegrations, (plugin) => ({\n ...plugin,\n interfaces: utils.records.mapValues(\n plugin.interfaces ?? {},\n (iface) =>\n ({\n integrationId: iface.id,\n integrationAlias: iface.integrationAlias,\n integrationInterfaceAlias: iface.integrationInterfaceAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['interfaces']\n >[string]\n ),\n integrations: utils.records.mapValues(\n plugin.integrations ?? {},\n (integration) =>\n ({\n integrationId: integration.id,\n integrationAlias: integration.integrationAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['integrations']\n >[string]\n ),\n })),\n }\n }\n\n protected async prepareIntegrationDependencies(\n integrationDef: sdk.IntegrationDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreateIntegrationRequestBody>> {\n const interfaces = await this._fetchDependencies({\n deps: integrationDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return { interfaces }\n }\n\n protected async preparePluginDependencies(\n pluginDef: sdk.PluginDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreatePluginRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: pluginDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: (dep) => `integration:${dep.name}@${dep.version}`,\n })\n const interfaces = await this._fetchDependencies({\n deps: pluginDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return {\n dependencies: {\n integrations,\n interfaces,\n },\n }\n }\n\n private _fetchDependencies = async <T extends { id?: string; name: string; version: string }>({\n deps,\n fetcher,\n cacheKey: getCacheKey,\n }: {\n deps: Record<string, T>\n fetcher: (dep: T) => Promise<ResolvedDependency>\n cacheKey: (dep: T) => DependencyCacheKey\n }): Promise<Record<string, T & ResolvedDependency>> => {\n const isRemote = (dep: T): dep is T & ResolvedDependency => dep.id !== undefined\n return utils.records.mapValuesAsync(deps, async (dep): Promise<T & ResolvedDependency> => {\n if (isRemote(dep)) {\n return dep\n }\n\n const cacheKey = getCacheKey(dep)\n const cached = this._dependencyCache.get(cacheKey)\n\n if (cached) {\n return { ...dep, id: cached.id }\n }\n\n const { id } = await fetcher(dep)\n this._dependencyCache.set(cacheKey, { id })\n\n return { ...dep, id }\n })\n }\n\n protected readProjectFile = async (\n filePath: string | undefined,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<string | undefined> => {\n if (!filePath) {\n return undefined\n }\n const absoluteFilePath = utils.path.absoluteFrom(this.projectPaths.abs.workDir, filePath)\n return fs.promises.readFile(absoluteFilePath, encoding).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not read file \"${absoluteFilePath}\"`)\n })\n }\n\n private _parseArgvSecrets(argvSecrets: string[]): Record<string, string> {\n const parsed: Record<string, string> = {}\n for (const secret of argvSecrets) {\n const [key, value] = utils.string.splitOnce(secret, '=')\n if (!value) {\n throw new errors.BotpressCLIError(\n `Secret \"${key}\" is missing a value. Expected format: \"SECRET_NAME=secretValue\"`\n )\n }\n parsed[key!] = value\n }\n\n return parsed\n }\n\n private _notifyUpdateSdk = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if sdk is up to date')\n\n const { workDir } = this.projectPaths.abs\n const readProjectPkgJsonResult = await utils.pkgJson.safeReadPackageJson(workDir)\n if (!readProjectPkgJsonResult.success) {\n this.logger.debug(`Could not read package.json at \"${workDir}\": ${readProjectPkgJsonResult.error.message}`)\n return\n }\n\n if (!readProjectPkgJsonResult.pkgJson) {\n this.logger.debug(`Could not find package.json at \"${workDir}\"`)\n return\n }\n\n const { pkgJson: projectPkgJson } = readProjectPkgJsonResult\n const sdkPackageName = '@botpress/sdk'\n const actualSdkVersion = utils.pkgJson.findDependency(projectPkgJson, sdkPackageName)\n if (!actualSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in project package.json`)\n return\n }\n\n if (actualSdkVersion.startsWith('workspace:')) {\n return\n }\n\n const actualCleanedSdkVersion = semver.valid(semver.coerce(actualSdkVersion))\n if (!actualCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${actualSdkVersion}\" in project package.json`)\n return\n }\n\n const cliPkgJson = await this.readCLIPkgJson()\n const expectedSdkVersion = utils.pkgJson.findDependency(cliPkgJson, sdkPackageName)\n if (!expectedSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in cli package.json`)\n return\n }\n\n const expectedCleanedSdkVersion = semver.valid(semver.coerce(expectedSdkVersion))\n if (!expectedCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${expectedSdkVersion}\" in cli package.json`)\n return\n }\n\n if (semver.eq(actualCleanedSdkVersion, expectedCleanedSdkVersion)) {\n return\n }\n\n const diff = semver.diff(actualCleanedSdkVersion, expectedCleanedSdkVersion)\n if (!diff) {\n this.logger.debug(`Could not compare versions \"${actualCleanedSdkVersion}\" and \"${expectedCleanedSdkVersion}\"`)\n return\n }\n\n const errorMsg = `Project SDK version is \"${actualCleanedSdkVersion}\", but expected \"${expectedCleanedSdkVersion}\"`\n if (utils.semver.releases.lt(diff, 'minor')) {\n this.logger.debug(`${errorMsg}. This may cause compatibility issues.`)\n return\n }\n\n this.logger.warn(chalk.bold(`${errorMsg}. This will cause compatibility issues.`))\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if sdk is up to date: ${err.message}`)\n }\n }\n protected validateIntegrationRegistration(\n updatedBot: UpdatedBot,\n onFailCallback: (failedIntegrations: UpdatedBot['integrations']) => void\n ) {\n let failedIntegrations: UpdatedBot['integrations'] = {}\n for (const [integrationName, integration] of Object.entries(updatedBot.integrations)) {\n if (integration.status === 'registration_failed') {\n failedIntegrations = { ...failedIntegrations, [integrationName]: integration }\n }\n }\n if (Object.keys(failedIntegrations).length > 0) {\n onFailCallback(failedIntegrations)\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type * as client from '@botpress/client'\nimport type * as sdk from '@botpress/sdk'\nimport type { YargsConfig } from '@bpinternal/yargs-extra'\nimport chalk from 'chalk'\nimport fs from 'fs'\nimport _ from 'lodash'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport * as config from '../config'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport { validateIntegrationDefinition, validateBotDefinition } from '../sdk'\nimport type { CommandArgv, CommandDefinition } from '../typings'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nexport type ProjectCommandDefinition = CommandDefinition<typeof config.schemas.project>\nexport type ProjectCache = {\n botId: string\n devId: string\n tunnelId: string\n secrets: {\n [secretName: string]: string\n }\n}\n\ntype ConfigurableProjectPaths = { workDir: string }\ntype ConstantProjectPaths = typeof consts.fromWorkDir\ntype AllProjectPaths = ConfigurableProjectPaths & ConstantProjectPaths\n\ntype LintIgnoredConfig = { bpLintDisabled?: boolean }\n\nexport type ProjectType = ProjectDefinition['type']\nexport type ProjectDefinition = LintIgnoredConfig &\n (\n | { type: 'integration'; definition: sdk.IntegrationDefinition }\n | { type: 'interface'; definition: sdk.InterfaceDefinition }\n | { type: 'bot'; definition: sdk.BotDefinition }\n | { type: 'plugin'; definition: sdk.PluginDefinition }\n )\n\ntype ProjectDefinitionResolver<T> = () => Promise<LintIgnoredConfig & T>\n\nexport type ProjectDefinitionLazy =\n | {\n projectType: 'integration'\n resolveProjectDefinition: ProjectDefinitionResolver<{\n type: 'integration'\n definition: sdk.IntegrationDefinition\n }>\n }\n | {\n projectType: 'bot'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'bot'; definition: sdk.BotDefinition }>\n }\n | {\n projectType: 'interface'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'interface'; definition: sdk.InterfaceDefinition }>\n }\n | {\n projectType: 'plugin'\n resolveProjectDefinition: ProjectDefinitionResolver<{ type: 'plugin'; definition: sdk.PluginDefinition }>\n }\n\ntype UpdatedBot = client.Bot\n\ntype ClientIntegrationDefinitions = Record<string, client.Integration>\ntype ClientIntegration = client.Bot['integrations'][string]\n\nclass ProjectPaths extends utils.path.PathStore<keyof AllProjectPaths> {\n public constructor(argv: CommandArgv<ProjectCommandDefinition>) {\n const absWorkDir = utils.path.absoluteFrom(utils.path.cwd(), argv.workDir)\n super({\n workDir: absWorkDir,\n ..._.mapValues(consts.fromWorkDir, (p) => utils.path.absoluteFrom(absWorkDir, p)),\n })\n }\n}\n\nexport class ProjectDefinitionContext {\n private _codeCache: Map<string, object> = new Map()\n private _buildContext: utils.esbuild.BuildEntrypointContext = new utils.esbuild.BuildEntrypointContext()\n\n public getOrResolveDefinition<T extends object>(code: string): T {\n const definition = this._codeCache.get(code)\n if (definition) {\n return definition as T\n }\n const result = utils.require.requireJsCode<{ default: object }>(code)\n this._codeCache.set(code, result.default)\n return result.default as T\n }\n\n public rebuildEntrypoint(...args: Parameters<utils.esbuild.BuildEntrypointContext['rebuild']>) {\n return this._buildContext.rebuild(...args)\n }\n}\n\ntype ResolvedDependency = { id: string }\ntype DependencyCacheKey = `${'integration' | 'plugin' | 'interface'}:${string}@${string}`\n\nexport abstract class ProjectCommand<C extends ProjectCommandDefinition> extends GlobalCommand<C> {\n protected projectContext: ProjectDefinitionContext = new ProjectDefinitionContext()\n private _dependencyCache = new Map<DependencyCacheKey, ResolvedDependency>()\n\n public setProjectContext(projectContext: ProjectDefinitionContext) {\n this.projectContext = projectContext\n return this\n }\n\n protected override async bootstrap() {\n await super.bootstrap()\n await this._notifyUpdateSdk()\n }\n\n protected get projectPaths() {\n return new ProjectPaths(this.argv)\n }\n\n protected get projectCache() {\n return new utils.cache.FSKeyValueCache<ProjectCache>(this.projectPaths.abs.projectCacheFile)\n }\n\n private _readProjectType(projectPaths: ProjectPaths): ProjectType {\n const abs = projectPaths.abs\n if (fs.existsSync(abs.integrationDefinition)) {\n return 'integration'\n }\n if (fs.existsSync(abs.interfaceDefinition)) {\n return 'interface'\n }\n if (fs.existsSync(abs.botDefinition)) {\n return 'bot'\n }\n if (fs.existsSync(abs.pluginDefinition)) {\n return 'plugin'\n }\n throw new errors.UnsupportedProjectType()\n }\n\n protected readProjectDefinitionFromFS(): ProjectDefinitionLazy {\n try {\n const type = this._readProjectType(this.projectPaths)\n if (type === 'integration') {\n return {\n projectType: 'integration',\n resolveProjectDefinition: async () => ({\n type: 'integration',\n ...(await this._readIntegrationDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'plugin') {\n return {\n projectType: 'plugin',\n resolveProjectDefinition: async () => ({\n type: 'plugin',\n ...(await this._readPluginDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'interface') {\n return {\n projectType: 'interface',\n resolveProjectDefinition: async () => ({\n type: 'interface',\n ...(await this._readInterfaceDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n if (type === 'bot') {\n return {\n projectType: 'bot',\n resolveProjectDefinition: async () => ({\n type: 'bot',\n ...(await this._readBotDefinitionFromFS(this.projectPaths)),\n }),\n }\n }\n } catch (thrown: unknown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Error while reading project definition')\n }\n throw new errors.ProjectDefinitionNotFoundError(this.projectPaths.abs.workDir)\n }\n\n private async _readIntegrationDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'integrationDefinition'>\n ): Promise<{ definition: sdk.IntegrationDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.integrationDefinition)) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.integrationDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.integrationDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read integration definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.IntegrationDefinition>(artifact.text)\n validateIntegrationDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readInterfaceDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'interfaceDefinition'>\n ): Promise<{ definition: sdk.InterfaceDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.interfaceDefinition)) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.interfaceDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.interfaceDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read interface definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.InterfaceDefinition>(artifact.text)\n\n return { definition, bpLintDisabled }\n }\n\n private async _readBotDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'botDefinition'>\n ): Promise<{ definition: sdk.BotDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.botDefinition)) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.botDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.botDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read bot definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.BotDefinition>(artifact.text)\n validateBotDefinition(definition)\n return { definition, bpLintDisabled }\n }\n\n private async _readPluginDefinitionFromFS(\n projectPaths: utils.path.PathStore<'workDir' | 'pluginDefinition'>\n ): Promise<{ definition: sdk.PluginDefinition } & LintIgnoredConfig> {\n const abs = projectPaths.abs\n const rel = projectPaths.rel('workDir')\n\n if (!fs.existsSync(abs.pluginDefinition)) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const bpLintDisabled = await this._isBpLintDisabled(abs.pluginDefinition)\n\n const { outputFiles } = await this.projectContext.rebuildEntrypoint({\n absWorkingDir: abs.workDir,\n entrypoint: rel.pluginDefinition,\n })\n\n const artifact = outputFiles?.[0]\n if (!artifact) {\n throw new errors.BotpressCLIError('Could not read plugin definition')\n }\n\n const definition = this.projectContext.getOrResolveDefinition<sdk.PluginDefinition>(artifact.text)\n // TODO: validate plugin definition\n return { definition, bpLintDisabled }\n }\n\n private async _isBpLintDisabled(definitionPath: string): Promise<boolean> {\n const tsContent = await fs.promises.readFile(definitionPath, 'utf-8')\n const regex = /\\/\\* bplint-disable \\*\\//\n return regex.test(tsContent)\n }\n\n protected async displayIntegrationUrls({ api, bot }: { api: apiUtils.ApiClient; bot: client.Bot }) {\n if (!_.keys(bot.integrations).length) {\n this.logger.debug('No integrations in bot')\n return\n }\n\n const integrationDefinitions = await utils.records.mapValuesAsync(bot.integrations, async (integration) =>\n api.getPublicOrPrivateIntegration({\n type: 'id',\n id: integration.id,\n })\n )\n\n this.logger.log('Integrations:')\n for (const [alias, integration] of Object.entries(bot.integrations)) {\n if (integration.enabled) {\n this.logger.log(`${alias} ${integration.version}:`, { prefix: { symbol: '\u2192', indent: 2 } })\n } else {\n this.logger.log(`${alias} ${integration.version} ${chalk.italic('(disabled)')}:`, {\n prefix: { symbol: '\u2192', indent: 2 },\n })\n }\n\n const integrationDefinition = integrationDefinitions[alias]\n const linkTemplateScript = integrationDefinition\n ? this._getLinkTemplateScript({ integration, integrationDefinition })\n : undefined\n this._displayWebhookUrl({ integration, integrationDefinition, linkTemplateScript })\n if (!integrationDefinition) {\n this.logger.debug(\n `No integration definition for integration ${alias} (${integration.name}, ${integration.id}), skipping OAuth or Sandbox links`\n )\n this.logger.line().commit()\n continue\n }\n const isSandbox =\n integration.configurationType === 'sandbox' && !!integrationDefinition.sandbox?.identifierExtractScript\n const showLink = !!linkTemplateScript && (isSandbox || !!integrationDefinition.identifier?.extractScript)\n if (showLink && isSandbox) {\n await this._displaySandboxLinkAndCode({ integration, alias, bot, api, linkTemplateScript })\n } else if (showLink) {\n this._displayAuthorizationLink({ integration, api, linkTemplateScript })\n }\n this.logger.line().commit()\n }\n }\n\n private _getLinkTemplateScript({\n integration,\n integrationDefinition,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n }) {\n const config =\n integration.configurationType === null\n ? integrationDefinition?.configuration\n : integrationDefinition?.configurations[integration.configurationType]\n return config?.identifier?.linkTemplateScript\n }\n\n private _displayWebhookUrl({\n integration,\n integrationDefinition,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n integrationDefinition?: ClientIntegrationDefinitions[string]\n linkTemplateScript?: string\n }) {\n const needsWebhook = !(integrationDefinition?.identifier && linkTemplateScript)\n const logFn = (needsWebhook ? this.logger.log : this.logger.debug).bind(this.logger)\n\n if (integration.enabled) {\n logFn(`${chalk.bold('Webhook')}: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n logFn(`Webhook: ${integration.webhookUrl}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _displayAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const authorizationLink = this._getAuthorizationLink({ integration, api, linkTemplateScript })\n const isAuthorized = !!integration.identifier\n const authorizationStatus = integration.identifier ? 'Authorized \u2713' : 'Authorize'\n if (integration.enabled && isAuthorized) {\n this.logger.log(`${chalk.bold(authorizationStatus)} : ${authorizationLink}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`${authorizationStatus}: ${authorizationLink}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n private _getLinkTemplateArgs({ integration, api }: { integration: ClientIntegration; api: apiUtils.ApiClient }) {\n // These are the values used by the studio\n let env: 'development' | 'preview' | 'production'\n if (api.url.includes(consts.stagingBotpressDomain)) {\n env = 'preview'\n } else if (api.url.includes(consts.productionBotpressDomain)) {\n env = 'production'\n } else {\n env = 'development'\n }\n return {\n env,\n webhookId: integration.webhookId,\n webhookUrl: api.url.replace('api', 'webhook'),\n }\n }\n\n private _getAuthorizationLink({\n integration,\n api,\n linkTemplateScript,\n }: {\n integration: client.Bot['integrations'][string]\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: this._getLinkTemplateArgs({ integration, api }),\n })\n }\n\n private _getSandboxLink({\n shareableId,\n integration,\n api,\n linkTemplateScript,\n }: {\n shareableId: string\n integration: ClientIntegration\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n return utils.vrl.getStringResult({\n code: linkTemplateScript,\n data: { shareableId, ...this._getLinkTemplateArgs({ integration, api }) },\n })\n }\n\n private async _displaySandboxLinkAndCode({\n integration,\n alias,\n bot,\n api,\n linkTemplateScript,\n }: {\n integration: ClientIntegration\n alias: string\n bot: client.Bot\n api: apiUtils.ApiClient\n linkTemplateScript: string\n }) {\n const shareableId = await api.getOrGenerateShareableId(bot.id, integration.id, alias)\n const sandboxLink = this._getSandboxLink({ shareableId, integration, api, linkTemplateScript })\n const sandboxInstruction = `Send '${shareableId}' to ${sandboxLink}`\n if (integration.enabled) {\n this.logger.log(`${chalk.bold('Sandbox')}: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CF', indent: 4 },\n })\n } else {\n this.logger.log(`Sandbox: ${sandboxInstruction}`, {\n prefix: { symbol: '\u25CB', indent: 4 },\n })\n }\n }\n\n protected async promptSecrets(\n def: { secrets?: Record<string, sdk.SecretDefinition> },\n argv: YargsConfig<typeof config.schemas.secrets>,\n opts: { formatEnv?: boolean; knownSecrets?: string[] } = {}\n ): Promise<Record<string, string | null>> {\n const formatEnv = opts.formatEnv ?? false\n const knownSecrets = opts.knownSecrets ?? []\n\n const { secrets: secretDefinitions } = def\n if (!secretDefinitions) {\n return {}\n }\n\n const secretArgv = this._parseArgvSecrets(argv.secrets)\n const invalidSecret = Object.keys(secretArgv).find((s) => !secretDefinitions[s])\n if (invalidSecret) {\n throw new errors.BotpressCLIError(`Secret ${invalidSecret} is not defined in the definition`)\n }\n\n const values: Record<string, string | null> = {}\n for (const [secretName, { optional }] of Object.entries(secretDefinitions)) {\n const argvSecret = secretArgv[secretName]\n if (argvSecret) {\n this.logger.debug(`Using secret \"${secretName}\" from argv`)\n values[secretName] = argvSecret\n continue\n }\n\n const alreadyKnown = knownSecrets.includes(secretName)\n let mode: string\n if (alreadyKnown) {\n mode = 'already set'\n } else if (optional) {\n mode = 'optional'\n } else {\n mode = 'required'\n }\n\n const prompted = await this.prompt.text(`Enter value for secret \"${secretName}\" (${mode})`)\n if (prompted) {\n values[secretName] = prompted\n continue\n }\n\n if (alreadyKnown) {\n this.logger.log(`Secret \"${secretName}\" is unchanged`)\n } else if (optional) {\n this.logger.warn(`Secret \"${secretName}\" is unassigned`)\n } else {\n throw new errors.BotpressCLIError(`Secret \"${secretName}\" is required`)\n }\n }\n\n for (const secretName of knownSecrets) {\n const isDefined = secretName in secretDefinitions\n if (isDefined) {\n continue\n }\n const prompted = await this.prompt.confirm(`Secret \"${secretName}\" was removed. Do you wish to delete it?`)\n if (prompted) {\n this.logger.log(`Deleting secret \"${secretName}\"`, { prefix: { symbol: '\u00D7', fg: 'red' } })\n values[secretName] = null\n }\n }\n\n if (!formatEnv) {\n return values\n }\n\n const envVariables = _.mapKeys(values, (_v, k) => codegen.secretEnvVariableName(k))\n return envVariables\n }\n\n protected async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n const partialBody = await apiUtils.prepareCreateIntegrationBody(integrationDef)\n\n let code: string | undefined = undefined\n if (fs.existsSync(this.projectPaths.abs.outFileCJS)) {\n code = await this.readProjectFile(this.projectPaths.abs.outFileCJS)\n }\n\n const icon = await this.readProjectFile(integrationDef.icon, 'base64')\n const readme = await this.readProjectFile(integrationDef.readme, 'base64')\n const extractScript = await this.readProjectFile(integrationDef.identifier?.extractScript)\n const fallbackHandlerScript = await this.readProjectFile(integrationDef.identifier?.fallbackHandlerScript)\n return {\n ...partialBody,\n code,\n icon,\n readme,\n identifier: {\n extractScript,\n fallbackHandlerScript,\n },\n configuration: integrationDef.configuration\n ? {\n schema: await utils.schema.mapZodToJsonSchema(integrationDef.configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions,\n }),\n identifier: {\n required: integrationDef.configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(\n integrationDef.configuration.identifier?.linkTemplateScript\n ),\n },\n }\n : undefined,\n configurations: integrationDef.configurations\n ? await utils.records.mapValuesAsync(integrationDef.configurations, async (configuration) => ({\n title: configuration.title,\n description: configuration.description,\n schema: await utils.schema.mapZodToJsonSchema(configuration, {\n useLegacyZuiTransformer: integrationDef.__advanced?.useLegacyZuiTransformer,\n toJSONSchemaOptions: integrationDef.__advanced?.toJSONSchemaOptions,\n }),\n identifier: {\n required: configuration.identifier?.required,\n linkTemplateScript: await this.readProjectFile(configuration.identifier?.linkTemplateScript),\n },\n }))\n : undefined,\n }\n }\n\n protected async prepareBotDependencies(\n botDef: sdk.BotDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.UpdateBotRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: botDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n })\n\n const plugins = await this._fetchDependencies({\n deps: botDef.plugins ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivatePlugin({ type: 'name', name, version }),\n cacheKey: ({ name, version }) => `plugin:${name}@${version}`,\n })\n\n const pluginsWithBackingIntegrations = await utils.records.mapValuesAsync(plugins, async (plugin) => ({\n ...plugin,\n interfaces: await this._fetchDependencies({\n deps: plugin.interfaces ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `interface:${name}@${version}`,\n }),\n integrations: await this._fetchDependencies({\n deps: plugin.integrations ?? {},\n fetcher: async ({ name, version }) => await api.getPublicOrPrivateIntegration({ name, version, type: 'name' }),\n cacheKey: ({ name, version }) => `integration:${name}@${version}`,\n }),\n }))\n\n return {\n integrations: utils.records.mapValues(\n integrations,\n ({ enabled, configurationType, configuration, disabledChannels, id }) =>\n ({\n enabled,\n configurationType,\n configuration,\n disabledChannels,\n integrationId: id,\n }) satisfies NonNullable<apiUtils.UpdateBotRequestBody['integrations']>[string]\n ),\n plugins: utils.records.mapValues(pluginsWithBackingIntegrations, (plugin) => ({\n ...plugin,\n interfaces: utils.records.mapValues(\n plugin.interfaces ?? {},\n (iface) =>\n ({\n integrationId: iface.id,\n integrationAlias: iface.integrationAlias,\n integrationInterfaceAlias: iface.integrationInterfaceAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['interfaces']\n >[string]\n ),\n integrations: utils.records.mapValues(\n plugin.integrations ?? {},\n (integration) =>\n ({\n integrationId: integration.id,\n integrationAlias: integration.integrationAlias,\n }) satisfies NonNullable<\n NonNullable<NonNullable<apiUtils.UpdateBotRequestBody['plugins']>[string]>['integrations']\n >[string]\n ),\n })),\n }\n }\n\n protected async prepareIntegrationDependencies(\n integrationDef: sdk.IntegrationDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreateIntegrationRequestBody>> {\n const interfaces = await this._fetchDependencies({\n deps: integrationDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return { interfaces }\n }\n\n protected async preparePluginDependencies(\n pluginDef: sdk.PluginDefinition,\n api: apiUtils.ApiClient\n ): Promise<Partial<apiUtils.CreatePluginRequestBody>> {\n const integrations = await this._fetchDependencies({\n deps: pluginDef.integrations ?? {},\n fetcher: ({ name, version }) => api.getPublicOrPrivateIntegration({ type: 'name', name, version }),\n cacheKey: (dep) => `integration:${dep.name}@${dep.version}`,\n })\n const interfaces = await this._fetchDependencies({\n deps: pluginDef.interfaces ?? {},\n fetcher: ({ name, version }) => api.getPublicInterface({ type: 'name', name, version }),\n cacheKey: (dep) => `interface:${dep.name}@${dep.version}`,\n })\n return {\n dependencies: {\n integrations,\n interfaces,\n },\n }\n }\n\n private _fetchDependencies = async <T extends { id?: string; name: string; version: string }>({\n deps,\n fetcher,\n cacheKey: getCacheKey,\n }: {\n deps: Record<string, T>\n fetcher: (dep: T) => Promise<ResolvedDependency>\n cacheKey: (dep: T) => DependencyCacheKey\n }): Promise<Record<string, T & ResolvedDependency>> => {\n const isRemote = (dep: T): dep is T & ResolvedDependency => dep.id !== undefined\n return utils.records.mapValuesAsync(deps, async (dep): Promise<T & ResolvedDependency> => {\n if (isRemote(dep)) {\n return dep\n }\n\n const cacheKey = getCacheKey(dep)\n const cached = this._dependencyCache.get(cacheKey)\n\n if (cached) {\n return { ...dep, id: cached.id }\n }\n\n const { id } = await fetcher(dep)\n this._dependencyCache.set(cacheKey, { id })\n\n return { ...dep, id }\n })\n }\n\n protected readProjectFile = async (\n filePath: string | undefined,\n encoding: BufferEncoding = 'utf-8'\n ): Promise<string | undefined> => {\n if (!filePath) {\n return undefined\n }\n const absoluteFilePath = utils.path.absoluteFrom(this.projectPaths.abs.workDir, filePath)\n return fs.promises.readFile(absoluteFilePath, encoding).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, `Could not read file \"${absoluteFilePath}\"`)\n })\n }\n\n private _parseArgvSecrets(argvSecrets: string[]): Record<string, string> {\n const parsed: Record<string, string> = {}\n for (const secret of argvSecrets) {\n const [key, value] = utils.string.splitOnce(secret, '=')\n if (!value) {\n throw new errors.BotpressCLIError(\n `Secret \"${key}\" is missing a value. Expected format: \"SECRET_NAME=secretValue\"`\n )\n }\n parsed[key!] = value\n }\n\n return parsed\n }\n\n private _notifyUpdateSdk = async (): Promise<void> => {\n try {\n this.logger.debug('Checking if sdk is up to date')\n\n const { workDir } = this.projectPaths.abs\n const readProjectPkgJsonResult = await utils.pkgJson.safeReadPackageJson(workDir)\n if (!readProjectPkgJsonResult.success) {\n this.logger.debug(`Could not read package.json at \"${workDir}\": ${readProjectPkgJsonResult.error.message}`)\n return\n }\n\n if (!readProjectPkgJsonResult.pkgJson) {\n this.logger.debug(`Could not find package.json at \"${workDir}\"`)\n return\n }\n\n const { pkgJson: projectPkgJson } = readProjectPkgJsonResult\n const sdkPackageName = '@botpress/sdk'\n const actualSdkVersion = utils.pkgJson.findDependency(projectPkgJson, sdkPackageName)\n if (!actualSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in project package.json`)\n return\n }\n\n if (actualSdkVersion.startsWith('workspace:')) {\n return\n }\n\n const actualCleanedSdkVersion = semver.valid(semver.coerce(actualSdkVersion))\n if (!actualCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${actualSdkVersion}\" in project package.json`)\n return\n }\n\n const cliPkgJson = await this.readCLIPkgJson()\n const expectedSdkVersion = utils.pkgJson.findDependency(cliPkgJson, sdkPackageName)\n if (!expectedSdkVersion) {\n this.logger.debug(`Could not find dependency \"${sdkPackageName}\" in cli package.json`)\n return\n }\n\n const expectedCleanedSdkVersion = semver.valid(semver.coerce(expectedSdkVersion))\n if (!expectedCleanedSdkVersion) {\n this.logger.debug(`Invalid sdk version \"${expectedSdkVersion}\" in cli package.json`)\n return\n }\n\n if (semver.eq(actualCleanedSdkVersion, expectedCleanedSdkVersion)) {\n return\n }\n\n const diff = semver.diff(actualCleanedSdkVersion, expectedCleanedSdkVersion)\n if (!diff) {\n this.logger.debug(`Could not compare versions \"${actualCleanedSdkVersion}\" and \"${expectedCleanedSdkVersion}\"`)\n return\n }\n\n const errorMsg = `Project SDK version is \"${actualCleanedSdkVersion}\", but expected \"${expectedCleanedSdkVersion}\"`\n if (utils.semver.releases.lt(diff, 'minor')) {\n this.logger.debug(`${errorMsg}. This may cause compatibility issues.`)\n return\n }\n\n this.logger.warn(chalk.bold(`${errorMsg}. This will cause compatibility issues.`))\n } catch (thrown) {\n const err = errors.BotpressCLIError.map(thrown)\n this.logger.debug(`Failed to check if sdk is up to date: ${err.message}`)\n }\n }\n protected validateIntegrationRegistration(\n updatedBot: UpdatedBot,\n onFailCallback: (failedIntegrations: UpdatedBot['integrations']) => void\n ) {\n let failedIntegrations: UpdatedBot['integrations'] = {}\n for (const [integrationName, integration] of Object.entries(updatedBot.integrations)) {\n if (integration.status === 'registration_failed') {\n failedIntegrations = { ...failedIntegrations, [integrationName]: integration }\n }\n }\n if (Object.keys(failedIntegrations).length > 0) {\n onFailCallback(failedIntegrations)\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAkB;AAClB,gBAAe;AACf,oBAAc;AACd,oBAAmB;AACnB,eAA0B;AAC1B,cAAyB;AAEzB,aAAwB;AACxB,aAAwB;AACxB,iBAAqE;AAErE,YAAuB;AACvB,4BAA8B;AAuD9B,MAAM,qBAAqB,MAAM,KAAK,UAAiC;AAAA,EAC9D,YAAY,MAA6C;AAC9D,UAAM,aAAa,MAAM,KAAK,aAAa,MAAM,KAAK,IAAI,GAAG,KAAK,OAAO;AACzE,UAAM;AAAA,MACJ,SAAS;AAAA,MACT,GAAG,cAAAA,QAAE,UAAU,OAAO,aAAa,CAAC,MAAM,MAAM,KAAK,aAAa,YAAY,CAAC,CAAC;AAAA,IAClF,CAAC;AAAA,EACH;AACF;AAEO,MAAM,yBAAyB;AAAA,EAC5B,aAAkC,oBAAI,IAAI;AAAA,EAC1C,gBAAsD,IAAI,MAAM,QAAQ,uBAAuB;AAAA,EAEhG,uBAAyC,MAAiB;AAC/D,UAAM,aAAa,KAAK,WAAW,IAAI,IAAI;AAC3C,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AACA,UAAM,SAAS,MAAM,QAAQ,cAAmC,IAAI;AACpE,SAAK,WAAW,IAAI,MAAM,OAAO,OAAO;AACxC,WAAO,OAAO;AAAA,EAChB;AAAA,EAEO,qBAAqB,MAAmE;AAC7F,WAAO,KAAK,cAAc,QAAQ,GAAG,IAAI;AAAA,EAC3C;AACF;AAKO,MAAe,uBAA2D,oCAAiB;AAAA,EACtF,iBAA2C,IAAI,yBAAyB;AAAA,EAC1E,mBAAmB,oBAAI,IAA4C;AAAA,EAEpE,kBAAkB,gBAA0C;AACjE,SAAK,iBAAiB;AACtB,WAAO;AAAA,EACT;AAAA,EAEA,MAAyB,YAAY;AACnC,UAAM,MAAM,UAAU;AACtB,UAAM,KAAK,iBAAiB;AAAA,EAC9B;AAAA,EAEA,IAAc,eAAe;AAC3B,WAAO,IAAI,aAAa,KAAK,IAAI;AAAA,EACnC;AAAA,EAEA,IAAc,eAAe;AAC3B,WAAO,IAAI,MAAM,MAAM,gBAA8B,KAAK,aAAa,IAAI,gBAAgB;AAAA,EAC7F;AAAA,EAEQ,iBAAiB,cAAyC;AAChE,UAAM,MAAM,aAAa;AACzB,QAAI,UAAAC,QAAG,WAAW,IAAI,qBAAqB,GAAG;AAC5C,aAAO;AAAA,IACT;AACA,QAAI,UAAAA,QAAG,WAAW,IAAI,mBAAmB,GAAG;AAC1C,aAAO;AAAA,IACT;AACA,QAAI,UAAAA,QAAG,WAAW,IAAI,aAAa,GAAG;AACpC,aAAO;AAAA,IACT;AACA,QAAI,UAAAA,QAAG,WAAW,IAAI,gBAAgB,GAAG;AACvC,aAAO;AAAA,IACT;AACA,UAAM,IAAI,OAAO,uBAAuB;AAAA,EAC1C;AAAA,EAEU,8BAAqD;AAC7D,QAAI;AACF,YAAM,OAAO,KAAK,iBAAiB,KAAK,YAAY;AACpD,UAAI,SAAS,eAAe;AAC1B,eAAO;AAAA,UACL,aAAa;AAAA,UACb,0BAA0B,aAAa;AAAA,YACrC,MAAM;AAAA,YACN,GAAI,MAAM,KAAK,iCAAiC,KAAK,YAAY;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,UAAU;AACrB,eAAO;AAAA,UACL,aAAa;AAAA,UACb,0BAA0B,aAAa;AAAA,YACrC,MAAM;AAAA,YACN,GAAI,MAAM,KAAK,4BAA4B,KAAK,YAAY;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,aAAa;AACxB,eAAO;AAAA,UACL,aAAa;AAAA,UACb,0BAA0B,aAAa;AAAA,YACrC,MAAM;AAAA,YACN,GAAI,MAAM,KAAK,+BAA+B,KAAK,YAAY;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AACA,UAAI,SAAS,OAAO;AAClB,eAAO;AAAA,UACL,aAAa;AAAA,UACb,0BAA0B,aAAa;AAAA,YACrC,MAAM;AAAA,YACN,GAAI,MAAM,KAAK,yBAAyB,KAAK,YAAY;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,QAAiB;AACxB,YAAM,OAAO,iBAAiB,KAAK,QAAQ,wCAAwC;AAAA,IACrF;AACA,UAAM,IAAI,OAAO,+BAA+B,KAAK,aAAa,IAAI,OAAO;AAAA,EAC/E;AAAA,EAEA,MAAc,iCACZ,cACwE;AACxE,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,aAAa,IAAI,SAAS;AAEtC,QAAI,CAAC,UAAAA,QAAG,WAAW,IAAI,qBAAqB,GAAG;AAC7C,YAAM,IAAI,OAAO,iBAAiB,uCAAuC;AAAA,IAC3E;AAEA,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,IAAI,qBAAqB;AAE7E,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,eAAe,kBAAkB;AAAA,MAClE,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI;AAAA,IAClB,CAAC;AAED,UAAM,WAAW,cAAc,CAAC;AAChC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,OAAO,iBAAiB,uCAAuC;AAAA,IAC3E;AAEA,UAAM,aAAa,KAAK,eAAe,uBAAkD,SAAS,IAAI;AACtG,kDAA8B,UAAU;AACxC,WAAO,EAAE,YAAY,eAAe;AAAA,EACtC;AAAA,EAEA,MAAc,+BACZ,cACsE;AACtE,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,aAAa,IAAI,SAAS;AAEtC,QAAI,CAAC,UAAAA,QAAG,WAAW,IAAI,mBAAmB,GAAG;AAC3C,YAAM,IAAI,OAAO,iBAAiB,qCAAqC;AAAA,IACzE;AAEA,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,IAAI,mBAAmB;AAE3E,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,eAAe,kBAAkB;AAAA,MAClE,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI;AAAA,IAClB,CAAC;AAED,UAAM,WAAW,cAAc,CAAC;AAChC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,OAAO,iBAAiB,qCAAqC;AAAA,IACzE;AAEA,UAAM,aAAa,KAAK,eAAe,uBAAgD,SAAS,IAAI;AAEpG,WAAO,EAAE,YAAY,eAAe;AAAA,EACtC;AAAA,EAEA,MAAc,yBACZ,cACgE;AAChE,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,aAAa,IAAI,SAAS;AAEtC,QAAI,CAAC,UAAAA,QAAG,WAAW,IAAI,aAAa,GAAG;AACrC,YAAM,IAAI,OAAO,iBAAiB,+BAA+B;AAAA,IACnE;AAEA,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,IAAI,aAAa;AAErE,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,eAAe,kBAAkB;AAAA,MAClE,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI;AAAA,IAClB,CAAC;AAED,UAAM,WAAW,cAAc,CAAC;AAChC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,OAAO,iBAAiB,+BAA+B;AAAA,IACnE;AAEA,UAAM,aAAa,KAAK,eAAe,uBAA0C,SAAS,IAAI;AAC9F,0CAAsB,UAAU;AAChC,WAAO,EAAE,YAAY,eAAe;AAAA,EACtC;AAAA,EAEA,MAAc,4BACZ,cACmE;AACnE,UAAM,MAAM,aAAa;AACzB,UAAM,MAAM,aAAa,IAAI,SAAS;AAEtC,QAAI,CAAC,UAAAA,QAAG,WAAW,IAAI,gBAAgB,GAAG;AACxC,YAAM,IAAI,OAAO,iBAAiB,kCAAkC;AAAA,IACtE;AAEA,UAAM,iBAAiB,MAAM,KAAK,kBAAkB,IAAI,gBAAgB;AAExE,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,eAAe,kBAAkB;AAAA,MAClE,eAAe,IAAI;AAAA,MACnB,YAAY,IAAI;AAAA,IAClB,CAAC;AAED,UAAM,WAAW,cAAc,CAAC;AAChC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,OAAO,iBAAiB,kCAAkC;AAAA,IACtE;AAEA,UAAM,aAAa,KAAK,eAAe,uBAA6C,SAAS,IAAI;AAEjG,WAAO,EAAE,YAAY,eAAe;AAAA,EACtC;AAAA,EAEA,MAAc,kBAAkB,gBAA0C;AACxE,UAAM,YAAY,MAAM,UAAAA,QAAG,SAAS,SAAS,gBAAgB,OAAO;AACpE,UAAM,QAAQ;AACd,WAAO,MAAM,KAAK,SAAS;AAAA,EAC7B;AAAA,EAEA,MAAgB,uBAAuB,EAAE,KAAK,IAAI,GAAiD;AACjG,QAAI,CAAC,cAAAD,QAAE,KAAK,IAAI,YAAY,EAAE,QAAQ;AACpC,WAAK,OAAO,MAAM,wBAAwB;AAC1C;AAAA,IACF;AAEA,UAAM,yBAAyB,MAAM,MAAM,QAAQ;AAAA,MAAe,IAAI;AAAA,MAAc,OAAO,gBACzF,IAAI,8BAA8B;AAAA,QAChC,MAAM;AAAA,QACN,IAAI,YAAY;AAAA,MAClB,CAAC;AAAA,IACH;AAEA,SAAK,OAAO,IAAI,eAAe;AAC/B,eAAW,CAAC,OAAO,WAAW,KAAK,OAAO,QAAQ,IAAI,YAAY,GAAG;AACnE,UAAI,YAAY,SAAS;AACvB,aAAK,OAAO,IAAI,GAAG,KAAK,IAAI,YAAY,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE,EAAE,CAAC;AAAA,MAC5F,OAAO;AACL,aAAK,OAAO,IAAI,GAAG,KAAK,IAAI,YAAY,OAAO,IAAI,aAAAE,QAAM,OAAO,YAAY,CAAC,KAAK;AAAA,UAChF,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,QACnC,CAAC;AAAA,MACH;AAEA,YAAM,wBAAwB,uBAAuB,KAAK;AAC1D,YAAM,qBAAqB,wBACvB,KAAK,uBAAuB,EAAE,aAAa,sBAAsB,CAAC,IAClE;AACJ,WAAK,mBAAmB,EAAE,aAAa,uBAAuB,mBAAmB,CAAC;AAClF,UAAI,CAAC,uBAAuB;AAC1B,aAAK,OAAO;AAAA,UACV,6CAA6C,KAAK,KAAK,YAAY,IAAI,KAAK,YAAY,EAAE;AAAA,QAC5F;AACA,aAAK,OAAO,KAAK,EAAE,OAAO;AAC1B;AAAA,MACF;AACA,YAAM,YACJ,YAAY,sBAAsB,aAAa,CAAC,CAAC,sBAAsB,SAAS;AAClF,YAAM,WAAW,CAAC,CAAC,uBAAuB,aAAa,CAAC,CAAC,sBAAsB,YAAY;AAC3F,UAAI,YAAY,WAAW;AACzB,cAAM,KAAK,2BAA2B,EAAE,aAAa,OAAO,KAAK,KAAK,mBAAmB,CAAC;AAAA,MAC5F,WAAW,UAAU;AACnB,aAAK,0BAA0B,EAAE,aAAa,KAAK,mBAAmB,CAAC;AAAA,MACzE;AACA,WAAK,OAAO,KAAK,EAAE,OAAO;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,uBAAuB;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,GAGG;AACD,UAAMC,UACJ,YAAY,sBAAsB,OAC9B,uBAAuB,gBACvB,uBAAuB,eAAe,YAAY,iBAAiB;AACzE,WAAOA,SAAQ,YAAY;AAAA,EAC7B;AAAA,EAEQ,mBAAmB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,eAAe,EAAE,uBAAuB,cAAc;AAC5D,UAAM,SAAS,eAAe,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,KAAK,KAAK,MAAM;AAEnF,QAAI,YAAY,SAAS;AACvB,YAAM,GAAG,aAAAD,QAAM,KAAK,SAAS,CAAC,KAAK,YAAY,UAAU,IAAI;AAAA,QAC3D,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,YAAM,YAAY,YAAY,UAAU,IAAI;AAAA,QAC1C,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,0BAA0B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,oBAAoB,KAAK,sBAAsB,EAAE,aAAa,KAAK,mBAAmB,CAAC;AAC7F,UAAM,eAAe,CAAC,CAAC,YAAY;AACnC,UAAM,sBAAsB,YAAY,aAAa,sBAAiB;AACtE,QAAI,YAAY,WAAW,cAAc;AACvC,WAAK,OAAO,IAAI,GAAG,aAAAA,QAAM,KAAK,mBAAmB,CAAC,MAAM,iBAAiB,IAAI;AAAA,QAC3E,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,WAAK,OAAO,IAAI,GAAG,mBAAmB,KAAK,iBAAiB,IAAI;AAAA,QAC9D,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,qBAAqB,EAAE,aAAa,IAAI,GAAgE;AAE9G,QAAI;AACJ,QAAI,IAAI,IAAI,SAAS,OAAO,qBAAqB,GAAG;AAClD,YAAM;AAAA,IACR,WAAW,IAAI,IAAI,SAAS,OAAO,wBAAwB,GAAG;AAC5D,YAAM;AAAA,IACR,OAAO;AACL,YAAM;AAAA,IACR;AACA,WAAO;AAAA,MACL;AAAA,MACA,WAAW,YAAY;AAAA,MACvB,YAAY,IAAI,IAAI,QAAQ,OAAO,SAAS;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,sBAAsB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,WAAO,MAAM,IAAI,gBAAgB;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM,KAAK,qBAAqB,EAAE,aAAa,IAAI,CAAC;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEQ,gBAAgB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKG;AACD,WAAO,MAAM,IAAI,gBAAgB;AAAA,MAC/B,MAAM;AAAA,MACN,MAAM,EAAE,aAAa,GAAG,KAAK,qBAAqB,EAAE,aAAa,IAAI,CAAC,EAAE;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,2BAA2B;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAMG;AACD,UAAM,cAAc,MAAM,IAAI,yBAAyB,IAAI,IAAI,YAAY,IAAI,KAAK;AACpF,UAAM,cAAc,KAAK,gBAAgB,EAAE,aAAa,aAAa,KAAK,mBAAmB,CAAC;AAC9F,UAAM,qBAAqB,SAAS,WAAW,QAAQ,WAAW;AAClE,QAAI,YAAY,SAAS;AACvB,WAAK,OAAO,IAAI,GAAG,aAAAA,QAAM,KAAK,SAAS,CAAC,KAAK,kBAAkB,IAAI;AAAA,QACjE,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,WAAK,OAAO,IAAI,YAAY,kBAAkB,IAAI;AAAA,QAChD,QAAQ,EAAE,QAAQ,UAAK,QAAQ,EAAE;AAAA,MACnC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAgB,cACd,KACA,MACA,OAAyD,CAAC,GAClB;AACxC,UAAM,YAAY,KAAK,aAAa;AACpC,UAAM,eAAe,KAAK,gBAAgB,CAAC;AAE3C,UAAM,EAAE,SAAS,kBAAkB,IAAI;AACvC,QAAI,CAAC,mBAAmB;AACtB,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,aAAa,KAAK,kBAAkB,KAAK,OAAO;AACtD,UAAM,gBAAgB,OAAO,KAAK,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC/E,QAAI,eAAe;AACjB,YAAM,IAAI,OAAO,iBAAiB,UAAU,aAAa,mCAAmC;AAAA,IAC9F;AAEA,UAAM,SAAwC,CAAC;AAC/C,eAAW,CAAC,YAAY,EAAE,SAAS,CAAC,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAC1E,YAAM,aAAa,WAAW,UAAU;AACxC,UAAI,YAAY;AACd,aAAK,OAAO,MAAM,iBAAiB,UAAU,aAAa;AAC1D,eAAO,UAAU,IAAI;AACrB;AAAA,MACF;AAEA,YAAM,eAAe,aAAa,SAAS,UAAU;AACrD,UAAI;AACJ,UAAI,cAAc;AAChB,eAAO;AAAA,MACT,WAAW,UAAU;AACnB,eAAO;AAAA,MACT,OAAO;AACL,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,MAAM,KAAK,OAAO,KAAK,2BAA2B,UAAU,MAAM,IAAI,GAAG;AAC1F,UAAI,UAAU;AACZ,eAAO,UAAU,IAAI;AACrB;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,aAAK,OAAO,IAAI,WAAW,UAAU,gBAAgB;AAAA,MACvD,WAAW,UAAU;AACnB,aAAK,OAAO,KAAK,WAAW,UAAU,iBAAiB;AAAA,MACzD,OAAO;AACL,cAAM,IAAI,OAAO,iBAAiB,WAAW,UAAU,eAAe;AAAA,MACxE;AAAA,IACF;AAEA,eAAW,cAAc,cAAc;AACrC,YAAM,YAAY,cAAc;AAChC,UAAI,WAAW;AACb;AAAA,MACF;AACA,YAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,WAAW,UAAU,0CAA0C;AAC1G,UAAI,UAAU;AACZ,aAAK,OAAO,IAAI,oBAAoB,UAAU,KAAK,EAAE,QAAQ,EAAE,QAAQ,QAAK,IAAI,MAAM,EAAE,CAAC;AACzF,eAAO,UAAU,IAAI;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,cAAAF,QAAE,QAAQ,QAAQ,CAAC,IAAI,MAAM,QAAQ,sBAAsB,CAAC,CAAC;AAClF,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,6BACd,gBACgD;AAChD,UAAM,cAAc,MAAM,SAAS,6BAA6B,cAAc;AAE9E,QAAI,OAA2B;AAC/B,QAAI,UAAAC,QAAG,WAAW,KAAK,aAAa,IAAI,UAAU,GAAG;AACnD,aAAO,MAAM,KAAK,gBAAgB,KAAK,aAAa,IAAI,UAAU;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,KAAK,gBAAgB,eAAe,MAAM,QAAQ;AACrE,UAAM,SAAS,MAAM,KAAK,gBAAgB,eAAe,QAAQ,QAAQ;AACzE,UAAM,gBAAgB,MAAM,KAAK,gBAAgB,eAAe,YAAY,aAAa;AACzF,UAAM,wBAAwB,MAAM,KAAK,gBAAgB,eAAe,YAAY,qBAAqB;AACzG,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,MACA,eAAe,eAAe,gBAC1B;AAAA,QACE,QAAQ,MAAM,MAAM,OAAO,mBAAmB,eAAe,eAAe;AAAA,UAC1E,yBAAyB,eAAe,YAAY;AAAA,UACpD,qBAAqB,eAAe,YAAY;AAAA,QAClD,CAAC;AAAA,QACD,YAAY;AAAA,UACV,UAAU,eAAe,cAAc,YAAY;AAAA,UACnD,oBAAoB,MAAM,KAAK;AAAA,YAC7B,eAAe,cAAc,YAAY;AAAA,UAC3C;AAAA,QACF;AAAA,MACF,IACA;AAAA,MACJ,gBAAgB,eAAe,iBAC3B,MAAM,MAAM,QAAQ,eAAe,eAAe,gBAAgB,OAAO,mBAAmB;AAAA,QAC1F,OAAO,cAAc;AAAA,QACrB,aAAa,cAAc;AAAA,QAC3B,QAAQ,MAAM,MAAM,OAAO,mBAAmB,eAAe;AAAA,UAC3D,yBAAyB,eAAe,YAAY;AAAA,UACpD,qBAAqB,eAAe,YAAY;AAAA,QAClD,CAAC;AAAA,QACD,YAAY;AAAA,UACV,UAAU,cAAc,YAAY;AAAA,UACpC,oBAAoB,MAAM,KAAK,gBAAgB,cAAc,YAAY,kBAAkB;AAAA,QAC7F;AAAA,MACF,EAAE,IACF;AAAA,IACN;AAAA,EACF;AAAA,EAEA,MAAgB,uBACd,QACA,KACiD;AACjD,UAAM,eAAe,MAAM,KAAK,mBAAmB;AAAA,MACjD,MAAM,OAAO,gBAAgB,CAAC;AAAA,MAC9B,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,8BAA8B,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACjG,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,eAAe,IAAI,IAAI,OAAO;AAAA,IACjE,CAAC;AAED,UAAM,UAAU,MAAM,KAAK,mBAAmB;AAAA,MAC5C,MAAM,OAAO,WAAW,CAAC;AAAA,MACzB,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI,yBAAyB,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACxG,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU,IAAI,IAAI,OAAO;AAAA,IAC5D,CAAC;AAED,UAAM,iCAAiC,MAAM,MAAM,QAAQ,eAAe,SAAS,OAAO,YAAY;AAAA,MACpG,GAAG;AAAA,MACH,YAAY,MAAM,KAAK,mBAAmB;AAAA,QACxC,MAAM,OAAO,cAAc,CAAC;AAAA,QAC5B,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI,8BAA8B,EAAE,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QAC7G,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,aAAa,IAAI,IAAI,OAAO;AAAA,MAC/D,CAAC;AAAA,MACD,cAAc,MAAM,KAAK,mBAAmB;AAAA,QAC1C,MAAM,OAAO,gBAAgB,CAAC;AAAA,QAC9B,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,IAAI,8BAA8B,EAAE,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QAC7G,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,eAAe,IAAI,IAAI,OAAO;AAAA,MACjE,CAAC;AAAA,IACH,EAAE;AAEF,WAAO;AAAA,MACL,cAAc,MAAM,QAAQ;AAAA,QAC1B;AAAA,QACA,CAAC,EAAE,SAAS,mBAAmB,eAAe,kBAAkB,GAAG,OAChE;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,SAAS,MAAM,QAAQ,UAAU,gCAAgC,CAAC,YAAY;AAAA,QAC5E,GAAG;AAAA,QACH,YAAY,MAAM,QAAQ;AAAA,UACxB,OAAO,cAAc,CAAC;AAAA,UACtB,CAAC,WACE;AAAA,YACC,eAAe,MAAM;AAAA,YACrB,kBAAkB,MAAM;AAAA,YACxB,2BAA2B,MAAM;AAAA,UACnC;AAAA,QAGJ;AAAA,QACA,cAAc,MAAM,QAAQ;AAAA,UAC1B,OAAO,gBAAgB,CAAC;AAAA,UACxB,CAAC,iBACE;AAAA,YACC,eAAe,YAAY;AAAA,YAC3B,kBAAkB,YAAY;AAAA,UAChC;AAAA,QAGJ;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAgB,+BACd,gBACA,KACyD;AACzD,UAAM,aAAa,MAAM,KAAK,mBAAmB;AAAA,MAC/C,MAAM,eAAe,cAAc,CAAC;AAAA,MACpC,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,mBAAmB,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACtF,UAAU,CAAC,QAAQ,aAAa,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,IACzD,CAAC;AACD,WAAO,EAAE,WAAW;AAAA,EACtB;AAAA,EAEA,MAAgB,0BACd,WACA,KACoD;AACpD,UAAM,eAAe,MAAM,KAAK,mBAAmB;AAAA,MACjD,MAAM,UAAU,gBAAgB,CAAC;AAAA,MACjC,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,8BAA8B,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACjG,UAAU,CAAC,QAAQ,eAAe,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,IAC3D,CAAC;AACD,UAAM,aAAa,MAAM,KAAK,mBAAmB;AAAA,MAC/C,MAAM,UAAU,cAAc,CAAC;AAAA,MAC/B,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,mBAAmB,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACtF,UAAU,CAAC,QAAQ,aAAa,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,IACzD,CAAC;AACD,WAAO;AAAA,MACL,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,OAAiE;AAAA,IAC5F;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ,MAIuD;AACrD,UAAM,WAAW,CAAC,QAA0C,IAAI,OAAO;AACvE,WAAO,MAAM,QAAQ,eAAe,MAAM,OAAO,QAAyC;AACxF,UAAI,SAAS,GAAG,GAAG;AACjB,eAAO;AAAA,MACT;AAEA,YAAM,WAAW,YAAY,GAAG;AAChC,YAAM,SAAS,KAAK,iBAAiB,IAAI,QAAQ;AAEjD,UAAI,QAAQ;AACV,eAAO,EAAE,GAAG,KAAK,IAAI,OAAO,GAAG;AAAA,MACjC;AAEA,YAAM,EAAE,GAAG,IAAI,MAAM,QAAQ,GAAG;AAChC,WAAK,iBAAiB,IAAI,UAAU,EAAE,GAAG,CAAC;AAE1C,aAAO,EAAE,GAAG,KAAK,GAAG;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEU,kBAAkB,OAC1B,UACA,WAA2B,YACK;AAChC,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AACA,UAAM,mBAAmB,MAAM,KAAK,aAAa,KAAK,aAAa,IAAI,SAAS,QAAQ;AACxF,WAAO,UAAAA,QAAG,SAAS,SAAS,kBAAkB,QAAQ,EAAE,MAAM,CAAC,WAAW;AACxE,YAAM,OAAO,iBAAiB,KAAK,QAAQ,wBAAwB,gBAAgB,GAAG;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,aAA+C;AACvE,UAAM,SAAiC,CAAC;AACxC,eAAW,UAAU,aAAa;AAChC,YAAM,CAAC,KAAK,KAAK,IAAI,MAAM,OAAO,UAAU,QAAQ,GAAG;AACvD,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,OAAO;AAAA,UACf,WAAW,GAAG;AAAA,QAChB;AAAA,MACF;AACA,aAAO,GAAI,IAAI;AAAA,IACjB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,YAA2B;AACpD,QAAI;AACF,WAAK,OAAO,MAAM,+BAA+B;AAEjD,YAAM,EAAE,QAAQ,IAAI,KAAK,aAAa;AACtC,YAAM,2BAA2B,MAAM,MAAM,QAAQ,oBAAoB,OAAO;AAChF,UAAI,CAAC,yBAAyB,SAAS;AACrC,aAAK,OAAO,MAAM,mCAAmC,OAAO,MAAM,yBAAyB,MAAM,OAAO,EAAE;AAC1G;AAAA,MACF;AAEA,UAAI,CAAC,yBAAyB,SAAS;AACrC,aAAK,OAAO,MAAM,mCAAmC,OAAO,GAAG;AAC/D;AAAA,MACF;AAEA,YAAM,EAAE,SAAS,eAAe,IAAI;AACpC,YAAM,iBAAiB;AACvB,YAAM,mBAAmB,MAAM,QAAQ,eAAe,gBAAgB,cAAc;AACpF,UAAI,CAAC,kBAAkB;AACrB,aAAK,OAAO,MAAM,8BAA8B,cAAc,2BAA2B;AACzF;AAAA,MACF;AAEA,UAAI,iBAAiB,WAAW,YAAY,GAAG;AAC7C;AAAA,MACF;AAEA,YAAM,0BAA0B,cAAAG,QAAO,MAAM,cAAAA,QAAO,OAAO,gBAAgB,CAAC;AAC5E,UAAI,CAAC,yBAAyB;AAC5B,aAAK,OAAO,MAAM,wBAAwB,gBAAgB,2BAA2B;AACrF;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,KAAK,eAAe;AAC7C,YAAM,qBAAqB,MAAM,QAAQ,eAAe,YAAY,cAAc;AAClF,UAAI,CAAC,oBAAoB;AACvB,aAAK,OAAO,MAAM,8BAA8B,cAAc,uBAAuB;AACrF;AAAA,MACF;AAEA,YAAM,4BAA4B,cAAAA,QAAO,MAAM,cAAAA,QAAO,OAAO,kBAAkB,CAAC;AAChF,UAAI,CAAC,2BAA2B;AAC9B,aAAK,OAAO,MAAM,wBAAwB,kBAAkB,uBAAuB;AACnF;AAAA,MACF;AAEA,UAAI,cAAAA,QAAO,GAAG,yBAAyB,yBAAyB,GAAG;AACjE;AAAA,MACF;AAEA,YAAM,OAAO,cAAAA,QAAO,KAAK,yBAAyB,yBAAyB;AAC3E,UAAI,CAAC,MAAM;AACT,aAAK,OAAO,MAAM,+BAA+B,uBAAuB,UAAU,yBAAyB,GAAG;AAC9G;AAAA,MACF;AAEA,YAAM,WAAW,2BAA2B,uBAAuB,oBAAoB,yBAAyB;AAChH,UAAI,MAAM,OAAO,SAAS,GAAG,MAAM,OAAO,GAAG;AAC3C,aAAK,OAAO,MAAM,GAAG,QAAQ,wCAAwC;AACrE;AAAA,MACF;AAEA,WAAK,OAAO,KAAK,aAAAF,QAAM,KAAK,GAAG,QAAQ,yCAAyC,CAAC;AAAA,IACnF,SAAS,QAAQ;AACf,YAAM,MAAM,OAAO,iBAAiB,IAAI,MAAM;AAC9C,WAAK,OAAO,MAAM,yCAAyC,IAAI,OAAO,EAAE;AAAA,IAC1E;AAAA,EACF;AAAA,EACU,gCACR,YACA,gBACA;AACA,QAAI,qBAAiD,CAAC;AACtD,eAAW,CAAC,iBAAiB,WAAW,KAAK,OAAO,QAAQ,WAAW,YAAY,GAAG;AACpF,UAAI,YAAY,WAAW,uBAAuB;AAChD,6BAAqB,EAAE,GAAG,oBAAoB,CAAC,eAAe,GAAG,YAAY;AAAA,MAC/E;AAAA,IACF;AACA,QAAI,OAAO,KAAK,kBAAkB,EAAE,SAAS,GAAG;AAC9C,qBAAe,kBAAkB;AAAA,IACnC;AAAA,EACF;AACF;",
|
|
6
6
|
"names": ["_", "fs", "chalk", "config", "semver"]
|
|
7
7
|
}
|
|
@@ -45,7 +45,7 @@ class ServeCommand extends import_project_command.ProjectCommand {
|
|
|
45
45
|
if (projectType === "interface") {
|
|
46
46
|
throw new errors.BotpressCLIError("An interface project has no implementation to serve.");
|
|
47
47
|
}
|
|
48
|
-
if (projectType === "integration") {
|
|
48
|
+
if (projectType === "integration" || projectType === "bot") {
|
|
49
49
|
const projectDef = await resolveProjectDefinition();
|
|
50
50
|
const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true });
|
|
51
51
|
const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/command-implementations/serve-command.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Bot as BotImpl, Integration as IntegrationImpl } from '@botpress/sdk'\nimport * as fs from 'fs'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { ProjectCommand } from './project-command'\n\ntype Serveable = BotImpl | IntegrationImpl\n\nexport type ServeCommandDefinition = typeof commandDefinitions.serve\nexport class ServeCommand extends ProjectCommand<ServeCommandDefinition> {\n public async run(): Promise<void> {\n const outfile = this.projectPaths.abs.outFileCJS\n if (!fs.existsSync(outfile)) {\n throw new errors.NoBundleFoundError()\n }\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('An interface project has no implementation to serve.')\n }\n\n if (projectType === 'integration') {\n const projectDef = await resolveProjectDefinition()\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n for (const [key, value] of Object.entries(nonNullSecretEnvVariables)) {\n process.env[key] = value\n }\n }\n\n this.logger.log(`Serving ${projectType}...`)\n\n const { default: serveable } = utils.require.requireJsFile<{ default: Serveable }>(outfile)\n const server = await serveable.start(this.argv.port)\n\n await new Promise<void>((resolve, reject) => {\n server.on('error', reject)\n server.on('close', resolve)\n })\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AAEpB,aAAwB;AACxB,YAAuB;AACvB,6BAA+B;AAKxB,MAAM,qBAAqB,sCAAuC;AAAA,EACvE,MAAa,MAAqB;AAChC,UAAM,UAAU,KAAK,aAAa,IAAI;AACtC,QAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,YAAM,IAAI,OAAO,mBAAmB;AAAA,IACtC;AAEA,UAAM,EAAE,aAAa,yBAAyB,IAAI,KAAK,4BAA4B;AACnF,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,OAAO,iBAAiB,sDAAsD;AAAA,IAC1F;AAEA,QAAI,gBAAgB,
|
|
4
|
+
"sourcesContent": ["import type { Bot as BotImpl, Integration as IntegrationImpl } from '@botpress/sdk'\nimport * as fs from 'fs'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport * as utils from '../utils'\nimport { ProjectCommand } from './project-command'\n\ntype Serveable = BotImpl | IntegrationImpl\n\nexport type ServeCommandDefinition = typeof commandDefinitions.serve\nexport class ServeCommand extends ProjectCommand<ServeCommandDefinition> {\n public async run(): Promise<void> {\n const outfile = this.projectPaths.abs.outFileCJS\n if (!fs.existsSync(outfile)) {\n throw new errors.NoBundleFoundError()\n }\n\n const { projectType, resolveProjectDefinition } = this.readProjectDefinitionFromFS()\n if (projectType === 'interface') {\n throw new errors.BotpressCLIError('An interface project has no implementation to serve.')\n }\n\n if (projectType === 'integration' || projectType === 'bot') {\n const projectDef = await resolveProjectDefinition()\n // TODO: store secrets in local cache to avoid prompting every time\n const secretEnvVariables = await this.promptSecrets(projectDef.definition, this.argv, { formatEnv: true })\n const nonNullSecretEnvVariables = utils.records.filterValues(secretEnvVariables, utils.guards.is.notNull)\n for (const [key, value] of Object.entries(nonNullSecretEnvVariables)) {\n process.env[key] = value\n }\n }\n\n this.logger.log(`Serving ${projectType}...`)\n\n const { default: serveable } = utils.require.requireJsFile<{ default: Serveable }>(outfile)\n const server = await serveable.start(this.argv.port)\n\n await new Promise<void>((resolve, reject) => {\n server.on('error', reject)\n server.on('close', resolve)\n })\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,SAAoB;AAEpB,aAAwB;AACxB,YAAuB;AACvB,6BAA+B;AAKxB,MAAM,qBAAqB,sCAAuC;AAAA,EACvE,MAAa,MAAqB;AAChC,UAAM,UAAU,KAAK,aAAa,IAAI;AACtC,QAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,YAAM,IAAI,OAAO,mBAAmB;AAAA,IACtC;AAEA,UAAM,EAAE,aAAa,yBAAyB,IAAI,KAAK,4BAA4B;AACnF,QAAI,gBAAgB,aAAa;AAC/B,YAAM,IAAI,OAAO,iBAAiB,sDAAsD;AAAA,IAC1F;AAEA,QAAI,gBAAgB,iBAAiB,gBAAgB,OAAO;AAC1D,YAAM,aAAa,MAAM,yBAAyB;AAElD,YAAM,qBAAqB,MAAM,KAAK,cAAc,WAAW,YAAY,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACzG,YAAM,4BAA4B,MAAM,QAAQ,aAAa,oBAAoB,MAAM,OAAO,GAAG,OAAO;AACxG,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,yBAAyB,GAAG;AACpE,gBAAQ,IAAI,GAAG,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,SAAK,OAAO,IAAI,WAAW,WAAW,KAAK;AAE3C,UAAM,EAAE,SAAS,UAAU,IAAI,MAAM,QAAQ,cAAsC,OAAO;AAC1F,UAAM,SAAS,MAAM,UAAU,MAAM,KAAK,KAAK,IAAI;AAEnD,UAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,aAAO,GAAG,SAAS,MAAM;AACzB,aAAO,GAAG,SAAS,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/config.d.ts
CHANGED
|
@@ -1517,4 +1517,44 @@ export declare const schemas: {
|
|
|
1517
1517
|
alias: string;
|
|
1518
1518
|
};
|
|
1519
1519
|
};
|
|
1520
|
+
readonly getProfile: {
|
|
1521
|
+
profileToGet: {
|
|
1522
|
+
type: "string";
|
|
1523
|
+
description: string;
|
|
1524
|
+
positional: true;
|
|
1525
|
+
idx: number;
|
|
1526
|
+
};
|
|
1527
|
+
displayToken: {
|
|
1528
|
+
type: "boolean";
|
|
1529
|
+
description: string;
|
|
1530
|
+
default: boolean;
|
|
1531
|
+
};
|
|
1532
|
+
verbose: {
|
|
1533
|
+
type: "boolean";
|
|
1534
|
+
description: string;
|
|
1535
|
+
alias: string;
|
|
1536
|
+
default: boolean;
|
|
1537
|
+
};
|
|
1538
|
+
confirm: {
|
|
1539
|
+
type: "boolean";
|
|
1540
|
+
description: string;
|
|
1541
|
+
alias: string;
|
|
1542
|
+
default: boolean;
|
|
1543
|
+
};
|
|
1544
|
+
json: {
|
|
1545
|
+
type: "boolean";
|
|
1546
|
+
description: string;
|
|
1547
|
+
default: boolean;
|
|
1548
|
+
};
|
|
1549
|
+
botpressHome: {
|
|
1550
|
+
type: "string";
|
|
1551
|
+
description: string;
|
|
1552
|
+
default: string;
|
|
1553
|
+
};
|
|
1554
|
+
profile: {
|
|
1555
|
+
type: "string";
|
|
1556
|
+
description: string;
|
|
1557
|
+
alias: string;
|
|
1558
|
+
};
|
|
1559
|
+
};
|
|
1520
1560
|
};
|
package/dist/config.js
CHANGED
|
@@ -372,6 +372,16 @@ const useProfileSchema = {
|
|
|
372
372
|
idx: 0
|
|
373
373
|
}
|
|
374
374
|
};
|
|
375
|
+
const getProfileSchema = {
|
|
376
|
+
...globalSchema,
|
|
377
|
+
profileToGet: {
|
|
378
|
+
type: "string",
|
|
379
|
+
description: "The CLI profile defined in the $BP_BOTPRESS_HOME/profiles.json",
|
|
380
|
+
positional: true,
|
|
381
|
+
idx: 0
|
|
382
|
+
},
|
|
383
|
+
displayToken: { type: "boolean", description: "Display the token in the bp profile", default: false }
|
|
384
|
+
};
|
|
375
385
|
const schemas = {
|
|
376
386
|
global: globalSchema,
|
|
377
387
|
project: projectSchema,
|
|
@@ -406,7 +416,8 @@ const schemas = {
|
|
|
406
416
|
chat: chatSchema,
|
|
407
417
|
listProfiles: listProfilesSchema,
|
|
408
418
|
activeProfile: activeProfileSchema,
|
|
409
|
-
useProfile: useProfileSchema
|
|
419
|
+
useProfile: useProfileSchema,
|
|
420
|
+
getProfile: getProfileSchema
|
|
410
421
|
};
|
|
411
422
|
// Annotate the CommonJS export names for ESM import in node:
|
|
412
423
|
0 && (module.exports = {
|