@botpress/cli 6.3.4 → 6.4.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.
@@ -1,44 +1,44 @@
1
1
 
2
- > @botpress/cli@6.3.4 build /home/runner/work/botpress/botpress/packages/cli
2
+ > @botpress/cli@6.4.0 build /home/runner/work/botpress/botpress/packages/cli
3
3
  > pnpm run build:types && pnpm run bundle && pnpm run template:gen
4
4
 
5
5
 
6
- > @botpress/cli@6.3.4 build:types /home/runner/work/botpress/botpress/packages/cli
6
+ > @botpress/cli@6.4.0 build:types /home/runner/work/botpress/botpress/packages/cli
7
7
  > tsc -p ./tsconfig.build.json
8
8
 
9
9
 
10
- > @botpress/cli@6.3.4 bundle /home/runner/work/botpress/botpress/packages/cli
10
+ > @botpress/cli@6.4.0 bundle /home/runner/work/botpress/botpress/packages/cli
11
11
  > ts-node -T build.ts
12
12
 
13
13
 
14
- > @botpress/cli@6.3.4 template:gen /home/runner/work/botpress/botpress/packages/cli
14
+ > @botpress/cli@6.4.0 template:gen /home/runner/work/botpress/botpress/packages/cli
15
15
  > pnpm -r --stream -F @bp-templates/* exec bp gen
16
16
 
17
- 🤖 Botpress CLI v6.3.4
18
- 🤖 Botpress CLI v6.3.4
17
+ 🤖 Botpress CLI v6.4.0
19
18
  ● Checking if cli is up to date
19
+ 🤖 Botpress CLI v6.4.0
20
20
  ● Checking if cli is up to date
21
- 🤖 Botpress CLI v6.3.4
21
+ 🤖 Botpress CLI v6.4.0
22
22
  ● Checking if cli is up to date
23
- 🤖 Botpress CLI v6.3.4
23
+ 🤖 Botpress CLI v6.4.0
24
24
  ● Checking if cli is up to date
25
25
  ● Checking if sdk is up to date
26
26
  ● Checking if sdk is up to date
27
27
  ● Checking if sdk is up to date
28
28
  ● Checking if sdk is up to date
29
- ○ Generating typings for integration hello-world...
30
- ○ Generating typings for plugin empty-plugin...
29
+ ○ Generating typings for bot...
31
30
  ○ Generating typings for integration empty-integration...
32
31
  ✓ Typings available at .botpress
33
32
 
34
- ○ Generating typings for bot...
35
33
  ✓ Typings available at .botpress
36
34
 
35
+ ○ Generating typings for integration hello-world...
36
+ ○ Generating typings for plugin empty-plugin...
37
37
  ✓ Typings available at .botpress
38
38
 
39
39
  ✓ Typings available at .botpress
40
40
 
41
- 🤖 Botpress CLI v6.3.4
41
+ 🤖 Botpress CLI v6.4.0
42
42
  ● Checking if cli is up to date
43
43
  ● Checking if sdk is up to date
44
44
  ○ Generating typings for integration webhook-message...
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/bot-commands.ts"],
4
- "sourcesContent": ["import chalk from 'chalk'\nimport { ApiClient } from 'src/api/client'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { GlobalCommand } from './global-command'\n\nexport type GetBotCommandDefinition = typeof commandDefinitions.bots.subcommands.get\nexport class GetBotCommand extends GlobalCommand<GetBotCommandDefinition> {\n public async run(): Promise<void> {\n const { client } = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n const { bot } = await client.getBot({ id: this.argv.botRef })\n this.logger.success(`Bot ${chalk.bold(this.argv.botRef)}:`)\n this.logger.json(bot)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get bot ${this.argv.botRef}`)\n }\n }\n}\n\nexport type ListBotsCommandDefinition = typeof commandDefinitions.bots.subcommands.list\nexport class ListBotsCommand extends GlobalCommand<ListBotsCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n const { dev } = this.argv\n const bots = await api.listAllPages(\n (x) => api.client.listBots({ ...x, dev }),\n (r) => r.bots\n )\n this.logger.success('Bots:')\n this.logger.json(bots)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list bots')\n }\n }\n}\n\nexport type DeleteBotCommandDefinition = typeof commandDefinitions.bots.subcommands.delete\nexport class DeleteBotCommand extends GlobalCommand<DeleteBotCommandDefinition> {\n public async run(): Promise<void> {\n const { client } = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n await client.deleteBot({ id: this.argv.botRef })\n this.logger.success(`Bot ${chalk.bold(this.argv.botRef)} deleted`)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not delete bot ${this.argv.botRef}`)\n }\n }\n}\n\nexport type CreateBotCommandDefinition = typeof commandDefinitions.bots.subcommands.create\nexport class CreateBotCommand extends GlobalCommand<CreateBotCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n if (this.argv.ifNotExists) {\n await this._getOrCreate(api, this.argv.name)\n return\n }\n await this._create(api, this.argv.name)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not create bot')\n }\n }\n\n private _getOrCreate = async (api: ApiClient, name: string | undefined) => {\n if (!name) {\n throw new errors.BotpressCLIError('option --if-not-exists requires that a name be provided')\n }\n const existingBot = await api.findBotByName(name)\n if (existingBot) {\n this.logger.success(`Bot ${chalk.bold(name)} already exists`)\n this.logger.json(existingBot)\n return\n }\n return this._create(api, name)\n }\n\n private _create = async (api: ApiClient, name: string | undefined) => {\n const { bot } = await api.client.createBot({ name })\n this.logger.success(`Bot ${chalk.bold(bot.id)}:`)\n this.logger.json(bot)\n }\n}\n"],
4
+ "sourcesContent": ["import chalk from 'chalk'\nimport { ApiClient } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { GlobalCommand } from './global-command'\n\nexport type GetBotCommandDefinition = typeof commandDefinitions.bots.subcommands.get\nexport class GetBotCommand extends GlobalCommand<GetBotCommandDefinition> {\n public async run(): Promise<void> {\n const { client } = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n const { bot } = await client.getBot({ id: this.argv.botRef })\n this.logger.success(`Bot ${chalk.bold(this.argv.botRef)}:`)\n this.logger.json(bot)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get bot ${this.argv.botRef}`)\n }\n }\n}\n\nexport type ListBotsCommandDefinition = typeof commandDefinitions.bots.subcommands.list\nexport class ListBotsCommand extends GlobalCommand<ListBotsCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n const { dev } = this.argv\n const bots = await api.listAllPages(\n (x) => api.client.listBots({ ...x, dev }),\n (r) => r.bots\n )\n this.logger.success('Bots:')\n this.logger.json(bots)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list bots')\n }\n }\n}\n\nexport type DeleteBotCommandDefinition = typeof commandDefinitions.bots.subcommands.delete\nexport class DeleteBotCommand extends GlobalCommand<DeleteBotCommandDefinition> {\n public async run(): Promise<void> {\n const { client } = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n await client.deleteBot({ id: this.argv.botRef })\n this.logger.success(`Bot ${chalk.bold(this.argv.botRef)} deleted`)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not delete bot ${this.argv.botRef}`)\n }\n }\n}\n\nexport type CreateBotCommandDefinition = typeof commandDefinitions.bots.subcommands.create\nexport class CreateBotCommand extends GlobalCommand<CreateBotCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n try {\n if (this.argv.ifNotExists) {\n await this._getOrCreate(api, this.argv.name)\n return\n }\n await this._create(api, this.argv.name)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not create bot')\n }\n }\n\n private _getOrCreate = async (api: ApiClient, name: string | undefined) => {\n if (!name) {\n throw new errors.BotpressCLIError('option --if-not-exists requires that a name be provided')\n }\n const existingBot = await api.findBotByName(name)\n if (existingBot) {\n this.logger.success(`Bot ${chalk.bold(name)} already exists`)\n this.logger.json(existingBot)\n return\n }\n return this._create(api, name)\n }\n\n private _create = async (api: ApiClient, name: string | undefined) => {\n const { bot } = await api.client.createBot({ name })\n this.logger.success(`Bot ${chalk.bold(bot.id)}:`)\n this.logger.json(bot)\n }\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAGlB,aAAwB;AACxB,4BAA8B;AAGvB,MAAM,sBAAsB,oCAAuC;AAAA,EACxE,MAAa,MAAqB;AAChC,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,2BAA2B,KAAK,IAAI;AAElE,QAAI;AACF,YAAM,EAAE,IAAI,IAAI,MAAM,OAAO,OAAO,EAAE,IAAI,KAAK,KAAK,OAAO,CAAC;AAC5D,WAAK,OAAO,QAAQ,OAAO,aAAAA,QAAM,KAAK,KAAK,KAAK,MAAM,CAAC,GAAG;AAC1D,WAAK,OAAO,KAAK,GAAG;AAAA,IACtB,SAAS,QAAQ;AACf,YAAM,OAAO,iBAAiB,KAAK,QAAQ,qBAAqB,KAAK,KAAK,MAAM,EAAE;AAAA,IACpF;AAAA,EACF;AACF;AAGO,MAAM,wBAAwB,oCAAyC;AAAA,EAC5E,MAAa,MAAqB;AAChC,UAAM,MAAM,MAAM,KAAK,2BAA2B,KAAK,IAAI;AAE3D,QAAI;AACF,YAAM,EAAE,IAAI,IAAI,KAAK;AACrB,YAAM,OAAO,MAAM,IAAI;AAAA,QACrB,CAAC,MAAM,IAAI,OAAO,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;AAAA,QACxC,CAAC,MAAM,EAAE;AAAA,MACX;AACA,WAAK,OAAO,QAAQ,OAAO;AAC3B,WAAK,OAAO,KAAK,IAAI;AAAA,IACvB,SAAS,QAAQ;AACf,YAAM,OAAO,iBAAiB,KAAK,QAAQ,qBAAqB;AAAA,IAClE;AAAA,EACF;AACF;AAGO,MAAM,yBAAyB,oCAA0C;AAAA,EAC9E,MAAa,MAAqB;AAChC,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,2BAA2B,KAAK,IAAI;AAElE,QAAI;AACF,YAAM,OAAO,UAAU,EAAE,IAAI,KAAK,KAAK,OAAO,CAAC;AAC/C,WAAK,OAAO,QAAQ,OAAO,aAAAA,QAAM,KAAK,KAAK,KAAK,MAAM,CAAC,UAAU;AAAA,IACnE,SAAS,QAAQ;AACf,YAAM,OAAO,iBAAiB,KAAK,QAAQ,wBAAwB,KAAK,KAAK,MAAM,EAAE;AAAA,IACvF;AAAA,EACF;AACF;AAGO,MAAM,yBAAyB,oCAA0C;AAAA,EAC9E,MAAa,MAAqB;AAChC,UAAM,MAAM,MAAM,KAAK,2BAA2B,KAAK,IAAI;AAE3D,QAAI;AACF,UAAI,KAAK,KAAK,aAAa;AACzB,cAAM,KAAK,aAAa,KAAK,KAAK,KAAK,IAAI;AAC3C;AAAA,MACF;AACA,YAAM,KAAK,QAAQ,KAAK,KAAK,KAAK,IAAI;AAAA,IACxC,SAAS,QAAQ;AACf,YAAM,OAAO,iBAAiB,KAAK,QAAQ,sBAAsB;AAAA,IACnE;AAAA,EACF;AAAA,EAEQ,eAAe,OAAO,KAAgB,SAA6B;AACzE,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,OAAO,iBAAiB,yDAAyD;AAAA,IAC7F;AACA,UAAM,cAAc,MAAM,IAAI,cAAc,IAAI;AAChD,QAAI,aAAa;AACf,WAAK,OAAO,QAAQ,OAAO,aAAAA,QAAM,KAAK,IAAI,CAAC,iBAAiB;AAC5D,WAAK,OAAO,KAAK,WAAW;AAC5B;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,KAAK,IAAI;AAAA,EAC/B;AAAA,EAEQ,UAAU,OAAO,KAAgB,SAA6B;AACpE,UAAM,EAAE,IAAI,IAAI,MAAM,IAAI,OAAO,UAAU,EAAE,KAAK,CAAC;AACnD,SAAK,OAAO,QAAQ,OAAO,aAAAA,QAAM,KAAK,IAAI,EAAE,CAAC,GAAG;AAChD,SAAK,OAAO,KAAK,GAAG;AAAA,EACtB;AACF;",
6
6
  "names": ["chalk"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/init-command.ts"],
4
- "sourcesContent": ["import type * as client from '@botpress/client'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\nimport * as pathlib from 'path'\nimport { ApiClient } from 'src/api'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { Logger } from '../logger'\nimport { ProjectTemplates } from '../project-templates'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nconst projectTypes = ['bot', 'integration', 'plugin'] as const\ntype ProjectType = (typeof projectTypes)[number]\n\ntype CopyProps = { srcDir: string; destDir: string; name: string; pkgJson: Record<string, unknown> }\n\nexport type InitCommandDefinition = typeof commandDefinitions.init\nexport class InitCommand extends GlobalCommand<InitCommandDefinition> {\n public async run(): Promise<void> {\n const projectType = await this._promptProjectType()\n const workDir = utils.path.absoluteFrom(utils.path.cwd(), this.argv.workDir)\n\n try {\n if (projectType === 'bot') {\n await this._initBot({ workDir })\n return\n }\n\n if (projectType === 'integration') {\n const workspaceHandle = await this._promptWorkspaceHandle()\n await this._initIntegration({ workDir, workspaceHandle })\n return\n }\n\n if (projectType === 'plugin') {\n const workspaceHandle = await this._promptWorkspaceHandle()\n await this._initPlugin({ workDir, workspaceHandle })\n return\n }\n } catch (error) {\n if (error instanceof errors.AbortedOperationError) {\n this.logger.log(error.message)\n return\n }\n throw error\n }\n\n type _assertion = utils.types.AssertNever<typeof projectType>\n throw new errors.BotpressCLIError(`Unknown project type: ${projectType}`)\n }\n\n private async _promptWorkspaceHandle() {\n const client = (await this.getAuthenticatedClient({})) ?? undefined\n\n const nameParts = this.argv.name?.split('/', 2) ?? []\n const workspaceHandle = nameParts.length > 1 ? nameParts[0] : undefined\n\n const resolver = await WorkspaceResolver.from({\n client,\n workspaceHandle,\n prompt: this.prompt,\n logger: this.logger,\n })\n\n return await resolver.getWorkspaceHandle()\n }\n\n private async _promptProjectType() {\n if (this.argv.type) {\n return this.argv.type\n }\n\n const promptedType = await this.prompt.select('What type of project do you wish to initialize?', {\n choices: projectTypes.map((t) => ({ title: t, value: t })),\n })\n\n if (!promptedType) {\n throw new errors.ParamRequiredError('Project Type')\n }\n\n return promptedType\n }\n\n private _initPlugin = async (args: { workDir: string; workspaceHandle: string }) => {\n const { workDir, workspaceHandle } = args\n const template = await this._getOrPromptForTemplate('plugin')\n const name = await this._getName('plugin', template.defaultProjectName)\n const { fullName, shortName } = this._getFullNameAndShortName({ workspaceHandle, name })\n\n await this._copy({\n srcDir: template.absolutePath,\n destDir: workDir,\n name: shortName,\n pkgJson: {\n pluginName: fullName,\n },\n })\n this.logger.success(`Plugin project initialized in ${chalk.bold(pathlib.join(workDir, shortName))}`)\n }\n\n private async _getOrPromptForTemplate(type: ProjectType): Promise<ProjectTemplates.Template> {\n const availableTemplates = ProjectTemplates.templates[type]\n\n if (this.argv.template) {\n const template = availableTemplates.find((t) => t.identifier === this.argv.template)\n if (!template) {\n throw new errors.BotpressCLIError(`No ${type} template found for identifier \"${this.argv.template}\"`)\n }\n return template\n }\n\n if (availableTemplates.length === 1) {\n this.logger.log(`Using default template: ${chalk.bold(availableTemplates[0].fullName)}`)\n return availableTemplates[0]\n }\n\n return await this._promptForTemplate(availableTemplates)\n }\n\n private async _promptForTemplate(\n availableTemplates: ProjectTemplates.TemplateArray\n ): Promise<ProjectTemplates.Template> {\n const templateIndex = await this.prompt.select<number>('Which template do you want to use?', {\n choices: availableTemplates.map((template, index) => ({\n title: template.fullName,\n value: index,\n })),\n default: 0,\n })\n\n if (templateIndex === undefined || templateIndex < 0 || templateIndex >= availableTemplates.length) {\n this.logger.log(`Using default template: ${chalk.bold(availableTemplates[0].fullName)}`)\n return availableTemplates[0]\n }\n\n return availableTemplates[templateIndex]!\n }\n\n private _getFullNameAndShortName(args: { workspaceHandle: string; name: string }) {\n const [workspaceOrName, projectName] = args.name.split('/', 2)\n const shortName = projectName ?? workspaceOrName!\n const fullName = `${args.workspaceHandle}/${shortName}`\n\n return { shortName, fullName }\n }\n\n private _initBot = async (args: { workDir: string }) => {\n const { workDir } = args\n const template = await this._getOrPromptForTemplate('bot')\n const name = await this._getName('bot', template.defaultProjectName)\n\n await this._copy({ srcDir: template.absolutePath, destDir: workDir, name, pkgJson: {} })\n this.logger.success(`Bot project initialized in ${chalk.bold(pathlib.join(workDir, name))}`)\n }\n\n private _initIntegration = async (args: { workDir: string; workspaceHandle: string }) => {\n const { workDir, workspaceHandle } = args\n const template = await this._getOrPromptForTemplate('integration')\n const name = await this._getName('integration', template.defaultProjectName)\n const { fullName, shortName } = this._getFullNameAndShortName({ workspaceHandle, name })\n\n await this._copy({\n srcDir: template.absolutePath,\n destDir: workDir,\n name: shortName,\n pkgJson: {\n integrationName: fullName,\n },\n })\n this.logger.success(`Integration project initialized in ${chalk.bold(pathlib.join(workDir, shortName))}`)\n return\n }\n\n private _getName = async (projectType: ProjectType, defaultName: string): Promise<string> => {\n if (this.argv.name) {\n return this.argv.name\n }\n const promptMessage = `What is the name of your ${projectType}?`\n const promptedName = await this.prompt.text(promptMessage, { initial: defaultName })\n if (!promptedName) {\n throw new errors.ParamRequiredError('Project Name')\n }\n return promptedName\n }\n\n private _copy = async (props: CopyProps) => {\n const { srcDir, destDir, name, pkgJson } = props\n\n const dirName = utils.casing.to.kebabCase(name)\n const destination = pathlib.join(destDir, dirName)\n\n const destinationCanBeUsed = await this._checkIfDestinationCanBeUsed(destination)\n if (!destinationCanBeUsed) {\n throw new errors.AbortedOperationError()\n }\n await fs.promises.rm(destination, { recursive: true, force: true })\n\n await fs.promises.cp(srcDir, destination, { recursive: true })\n\n const json = await utils.pkgJson.readPackageJson(destination).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Failed to read package.json file')\n })\n\n const pkgJsonName = utils.casing.to.snakeCase(name)\n const updatedJson = { name: pkgJsonName, ...json, ...pkgJson }\n await utils.pkgJson.writePackageJson(destination, updatedJson).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Failed to write package.json file')\n })\n }\n\n private _checkIfDestinationCanBeUsed = async (destination: string) => {\n if (fs.existsSync(destination)) {\n const override = await this.prompt.confirm(\n `Directory ${chalk.bold(destination)} already exists. Do you want to overwrite it?`\n )\n if (!override) {\n return false\n }\n }\n return true\n }\n}\n\nclass WorkspaceResolver {\n private _workspaces: client.Workspace[] = []\n private _currentWorkspace?: client.Workspace\n\n private constructor(\n private readonly _client: ApiClient | undefined,\n private readonly _workspaceHandle: string | undefined,\n private readonly _prompt: utils.prompt.CLIPrompt,\n private readonly _logger: Logger\n ) {}\n\n public static async from({\n client,\n workspaceHandle,\n prompt,\n logger,\n }: {\n client?: ApiClient\n workspaceHandle?: string\n prompt: utils.prompt.CLIPrompt\n logger: Logger\n }): Promise<WorkspaceResolver> {\n const resolver = new WorkspaceResolver(client, workspaceHandle, prompt, logger)\n await resolver._fetchWorkspaces()\n return resolver\n }\n\n public async getWorkspaceHandle(): Promise<string> {\n if (this._hasNoWorkspaces()) {\n return this._promptForArbitraryWorkspaceHandle()\n }\n\n const workspace = await this._promptUserToSelectWorkspace()\n return workspace.handle || (await this._assignHandleToWorkspace(workspace))\n }\n\n private async _fetchWorkspaces(): Promise<void> {\n if (!this._isAuthenticated()) {\n return\n }\n\n const workspaces = await this._getClient()\n .client.list.workspaces({})\n .collect({})\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Unable to list your workspaces')\n })\n const currentWorkspace = workspaces.find((ws) => ws.id === this._getClient().workspaceId)\n\n this._workspaces = workspaces\n this._currentWorkspace = currentWorkspace\n }\n\n private _isAuthenticated(): boolean {\n return !!this._client\n }\n\n private _hasNoWorkspaces(): boolean {\n return !this._isAuthenticated() || this._workspaces.length === 0 || !this._currentWorkspace\n }\n\n private async _promptForArbitraryWorkspaceHandle(): Promise<string> {\n if (this._workspaceHandle) {\n return this._workspaceHandle\n }\n\n const handle = await this._prompt.text('Enter your workspace handle')\n\n if (!handle) {\n throw new errors.ParamRequiredError('Workspace handle')\n }\n\n return handle\n }\n\n private async _promptUserToSelectWorkspace(): Promise<client.Workspace> {\n const workspaceChoices = this._workspaces.map((ws) => ({\n title: ws.name,\n value: ws.id,\n }))\n\n const initialChoice = {\n title: this._currentWorkspace!.name,\n value: this._currentWorkspace!.id,\n }\n\n const workspaceId = await this._prompt.select('Which workspace do you want to use?', {\n initial: initialChoice,\n choices: workspaceChoices,\n })\n\n if (!workspaceId) {\n throw new errors.ParamRequiredError('Workspace')\n }\n\n return this._workspaces.find((ws) => ws.id === workspaceId)!\n }\n\n private async _assignHandleToWorkspace(workspace: client.Workspace): Promise<string> {\n this._logger.warn(\"It seems you don't have a workspace handle yet.\")\n\n let claimedHandle: string | undefined\n\n do {\n const desiredHandle = await this._promptForDesiredHandle()\n const isAvailable = await this._checkHandleAvailability(desiredHandle)\n\n if (isAvailable) {\n claimedHandle = desiredHandle\n await this._updateWorkspaceWithHandle(workspace.id, claimedHandle)\n }\n } while (!claimedHandle)\n\n this._logger.success(`Handle \"${claimedHandle}\" is yours!`)\n return claimedHandle\n }\n\n private async _promptForDesiredHandle(): Promise<string> {\n const desiredHandle = await this._prompt.text('Please enter a workspace handle')\n\n if (!desiredHandle) {\n throw new errors.BotpressCLIError('Workspace handle is required')\n }\n\n return desiredHandle\n }\n\n private async _checkHandleAvailability(handle: string): Promise<boolean> {\n const { available, suggestions } = await this._getClient().client.checkHandleAvailability({ handle })\n\n if (!available) {\n this._logger.warn(`Handle \"${handle}\" is not available. Suggestions: ${suggestions.join(', ')}`)\n return false\n }\n\n return true\n }\n\n private async _updateWorkspaceWithHandle(workspaceId: string, handle: string): Promise<void> {\n try {\n await this._getClient().switchWorkspace(workspaceId).updateWorkspace({ handle })\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${handle}\"`)\n }\n }\n\n private _getClient(): ApiClient {\n if (!this._client) {\n throw new errors.BotpressCLIError('Could not authenticate')\n }\n return this._client\n }\n}\n"],
4
+ "sourcesContent": ["import type * as client from '@botpress/client'\nimport chalk from 'chalk'\nimport * as fs from 'fs'\nimport * as pathlib from 'path'\nimport { ApiClient } from '../api'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { Logger } from '../logger'\nimport { ProjectTemplates } from '../project-templates'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\n\nconst projectTypes = ['bot', 'integration', 'plugin'] as const\ntype ProjectType = (typeof projectTypes)[number]\n\ntype CopyProps = { srcDir: string; destDir: string; name: string; pkgJson: Record<string, unknown> }\n\nexport type InitCommandDefinition = typeof commandDefinitions.init\nexport class InitCommand extends GlobalCommand<InitCommandDefinition> {\n public async run(): Promise<void> {\n const projectType = await this._promptProjectType()\n const workDir = utils.path.absoluteFrom(utils.path.cwd(), this.argv.workDir)\n\n try {\n if (projectType === 'bot') {\n await this._initBot({ workDir })\n return\n }\n\n if (projectType === 'integration') {\n const workspaceHandle = await this._promptWorkspaceHandle()\n await this._initIntegration({ workDir, workspaceHandle })\n return\n }\n\n if (projectType === 'plugin') {\n const workspaceHandle = await this._promptWorkspaceHandle()\n await this._initPlugin({ workDir, workspaceHandle })\n return\n }\n } catch (error) {\n if (error instanceof errors.AbortedOperationError) {\n this.logger.log(error.message)\n return\n }\n throw error\n }\n\n type _assertion = utils.types.AssertNever<typeof projectType>\n throw new errors.BotpressCLIError(`Unknown project type: ${projectType}`)\n }\n\n private async _promptWorkspaceHandle() {\n const client = (await this.getAuthenticatedClient({})) ?? undefined\n\n const nameParts = this.argv.name?.split('/', 2) ?? []\n const workspaceHandle = nameParts.length > 1 ? nameParts[0] : undefined\n\n const resolver = await WorkspaceResolver.from({\n client,\n workspaceHandle,\n prompt: this.prompt,\n logger: this.logger,\n })\n\n return await resolver.getWorkspaceHandle()\n }\n\n private async _promptProjectType() {\n if (this.argv.type) {\n return this.argv.type\n }\n\n const promptedType = await this.prompt.select('What type of project do you wish to initialize?', {\n choices: projectTypes.map((t) => ({ title: t, value: t })),\n })\n\n if (!promptedType) {\n throw new errors.ParamRequiredError('Project Type')\n }\n\n return promptedType\n }\n\n private _initPlugin = async (args: { workDir: string; workspaceHandle: string }) => {\n const { workDir, workspaceHandle } = args\n const template = await this._getOrPromptForTemplate('plugin')\n const name = await this._getName('plugin', template.defaultProjectName)\n const { fullName, shortName } = this._getFullNameAndShortName({ workspaceHandle, name })\n\n await this._copy({\n srcDir: template.absolutePath,\n destDir: workDir,\n name: shortName,\n pkgJson: {\n pluginName: fullName,\n },\n })\n this.logger.success(`Plugin project initialized in ${chalk.bold(pathlib.join(workDir, shortName))}`)\n }\n\n private async _getOrPromptForTemplate(type: ProjectType): Promise<ProjectTemplates.Template> {\n const availableTemplates = ProjectTemplates.templates[type]\n\n if (this.argv.template) {\n const template = availableTemplates.find((t) => t.identifier === this.argv.template)\n if (!template) {\n throw new errors.BotpressCLIError(`No ${type} template found for identifier \"${this.argv.template}\"`)\n }\n return template\n }\n\n if (availableTemplates.length === 1) {\n this.logger.log(`Using default template: ${chalk.bold(availableTemplates[0].fullName)}`)\n return availableTemplates[0]\n }\n\n return await this._promptForTemplate(availableTemplates)\n }\n\n private async _promptForTemplate(\n availableTemplates: ProjectTemplates.TemplateArray\n ): Promise<ProjectTemplates.Template> {\n const templateIndex = await this.prompt.select<number>('Which template do you want to use?', {\n choices: availableTemplates.map((template, index) => ({\n title: template.fullName,\n value: index,\n })),\n default: 0,\n })\n\n if (templateIndex === undefined || templateIndex < 0 || templateIndex >= availableTemplates.length) {\n this.logger.log(`Using default template: ${chalk.bold(availableTemplates[0].fullName)}`)\n return availableTemplates[0]\n }\n\n return availableTemplates[templateIndex]!\n }\n\n private _getFullNameAndShortName(args: { workspaceHandle: string; name: string }) {\n const [workspaceOrName, projectName] = args.name.split('/', 2)\n const shortName = projectName ?? workspaceOrName!\n const fullName = `${args.workspaceHandle}/${shortName}`\n\n return { shortName, fullName }\n }\n\n private _initBot = async (args: { workDir: string }) => {\n const { workDir } = args\n const template = await this._getOrPromptForTemplate('bot')\n const name = await this._getName('bot', template.defaultProjectName)\n\n await this._copy({ srcDir: template.absolutePath, destDir: workDir, name, pkgJson: {} })\n this.logger.success(`Bot project initialized in ${chalk.bold(pathlib.join(workDir, name))}`)\n }\n\n private _initIntegration = async (args: { workDir: string; workspaceHandle: string }) => {\n const { workDir, workspaceHandle } = args\n const template = await this._getOrPromptForTemplate('integration')\n const name = await this._getName('integration', template.defaultProjectName)\n const { fullName, shortName } = this._getFullNameAndShortName({ workspaceHandle, name })\n\n await this._copy({\n srcDir: template.absolutePath,\n destDir: workDir,\n name: shortName,\n pkgJson: {\n integrationName: fullName,\n },\n })\n this.logger.success(`Integration project initialized in ${chalk.bold(pathlib.join(workDir, shortName))}`)\n return\n }\n\n private _getName = async (projectType: ProjectType, defaultName: string): Promise<string> => {\n if (this.argv.name) {\n return this.argv.name\n }\n const promptMessage = `What is the name of your ${projectType}?`\n const promptedName = await this.prompt.text(promptMessage, { initial: defaultName })\n if (!promptedName) {\n throw new errors.ParamRequiredError('Project Name')\n }\n return promptedName\n }\n\n private _copy = async (props: CopyProps) => {\n const { srcDir, destDir, name, pkgJson } = props\n\n const dirName = utils.casing.to.kebabCase(name)\n const destination = pathlib.join(destDir, dirName)\n\n const destinationCanBeUsed = await this._checkIfDestinationCanBeUsed(destination)\n if (!destinationCanBeUsed) {\n throw new errors.AbortedOperationError()\n }\n await fs.promises.rm(destination, { recursive: true, force: true })\n\n await fs.promises.cp(srcDir, destination, { recursive: true })\n\n const json = await utils.pkgJson.readPackageJson(destination).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Failed to read package.json file')\n })\n\n const pkgJsonName = utils.casing.to.snakeCase(name)\n const updatedJson = { name: pkgJsonName, ...json, ...pkgJson }\n await utils.pkgJson.writePackageJson(destination, updatedJson).catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Failed to write package.json file')\n })\n }\n\n private _checkIfDestinationCanBeUsed = async (destination: string) => {\n if (fs.existsSync(destination)) {\n const override = await this.prompt.confirm(\n `Directory ${chalk.bold(destination)} already exists. Do you want to overwrite it?`\n )\n if (!override) {\n return false\n }\n }\n return true\n }\n}\n\nclass WorkspaceResolver {\n private _workspaces: client.Workspace[] = []\n private _currentWorkspace?: client.Workspace\n\n private constructor(\n private readonly _client: ApiClient | undefined,\n private readonly _workspaceHandle: string | undefined,\n private readonly _prompt: utils.prompt.CLIPrompt,\n private readonly _logger: Logger\n ) {}\n\n public static async from({\n client,\n workspaceHandle,\n prompt,\n logger,\n }: {\n client?: ApiClient\n workspaceHandle?: string\n prompt: utils.prompt.CLIPrompt\n logger: Logger\n }): Promise<WorkspaceResolver> {\n const resolver = new WorkspaceResolver(client, workspaceHandle, prompt, logger)\n await resolver._fetchWorkspaces()\n return resolver\n }\n\n public async getWorkspaceHandle(): Promise<string> {\n if (this._hasNoWorkspaces()) {\n return this._promptForArbitraryWorkspaceHandle()\n }\n\n const workspace = await this._promptUserToSelectWorkspace()\n return workspace.handle || (await this._assignHandleToWorkspace(workspace))\n }\n\n private async _fetchWorkspaces(): Promise<void> {\n if (!this._isAuthenticated()) {\n return\n }\n\n const workspaces = await this._getClient()\n .client.list.workspaces({})\n .collect({})\n .catch((thrown) => {\n throw errors.BotpressCLIError.wrap(thrown, 'Unable to list your workspaces')\n })\n const currentWorkspace = workspaces.find((ws) => ws.id === this._getClient().workspaceId)\n\n this._workspaces = workspaces\n this._currentWorkspace = currentWorkspace\n }\n\n private _isAuthenticated(): boolean {\n return !!this._client\n }\n\n private _hasNoWorkspaces(): boolean {\n return !this._isAuthenticated() || this._workspaces.length === 0 || !this._currentWorkspace\n }\n\n private async _promptForArbitraryWorkspaceHandle(): Promise<string> {\n if (this._workspaceHandle) {\n return this._workspaceHandle\n }\n\n const handle = await this._prompt.text('Enter your workspace handle')\n\n if (!handle) {\n throw new errors.ParamRequiredError('Workspace handle')\n }\n\n return handle\n }\n\n private async _promptUserToSelectWorkspace(): Promise<client.Workspace> {\n const workspaceChoices = this._workspaces.map((ws) => ({\n title: ws.name,\n value: ws.id,\n }))\n\n const initialChoice = {\n title: this._currentWorkspace!.name,\n value: this._currentWorkspace!.id,\n }\n\n const workspaceId = await this._prompt.select('Which workspace do you want to use?', {\n initial: initialChoice,\n choices: workspaceChoices,\n })\n\n if (!workspaceId) {\n throw new errors.ParamRequiredError('Workspace')\n }\n\n return this._workspaces.find((ws) => ws.id === workspaceId)!\n }\n\n private async _assignHandleToWorkspace(workspace: client.Workspace): Promise<string> {\n this._logger.warn(\"It seems you don't have a workspace handle yet.\")\n\n let claimedHandle: string | undefined\n\n do {\n const desiredHandle = await this._promptForDesiredHandle()\n const isAvailable = await this._checkHandleAvailability(desiredHandle)\n\n if (isAvailable) {\n claimedHandle = desiredHandle\n await this._updateWorkspaceWithHandle(workspace.id, claimedHandle)\n }\n } while (!claimedHandle)\n\n this._logger.success(`Handle \"${claimedHandle}\" is yours!`)\n return claimedHandle\n }\n\n private async _promptForDesiredHandle(): Promise<string> {\n const desiredHandle = await this._prompt.text('Please enter a workspace handle')\n\n if (!desiredHandle) {\n throw new errors.BotpressCLIError('Workspace handle is required')\n }\n\n return desiredHandle\n }\n\n private async _checkHandleAvailability(handle: string): Promise<boolean> {\n const { available, suggestions } = await this._getClient().client.checkHandleAvailability({ handle })\n\n if (!available) {\n this._logger.warn(`Handle \"${handle}\" is not available. Suggestions: ${suggestions.join(', ')}`)\n return false\n }\n\n return true\n }\n\n private async _updateWorkspaceWithHandle(workspaceId: string, handle: string): Promise<void> {\n try {\n await this._getClient().switchWorkspace(workspaceId).updateWorkspace({ handle })\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not claim handle \"${handle}\"`)\n }\n }\n\n private _getClient(): ApiClient {\n if (!this._client) {\n throw new errors.BotpressCLIError('Could not authenticate')\n }\n return this._client\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["chalk"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/integration-commands.ts"],
4
- "sourcesContent": ["import chalk from 'chalk'\nimport _ from 'lodash'\nimport { ApiClient, PublicOrPrivateIntegration, IntegrationSummary } from 'src/api/client'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { NamePackageRef, parsePackageRef } from '../package-ref'\nimport { GlobalCommand } from './global-command'\n\nexport type GetIntegrationCommandDefinition = typeof commandDefinitions.integrations.subcommands.get\nexport class GetIntegrationCommand extends GlobalCommand<GetIntegrationCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const parsedRef = parsePackageRef(this.argv.integrationRef)\n if (!parsedRef) {\n throw new errors.InvalidPackageReferenceError(this.argv.integrationRef)\n }\n if (parsedRef.type === 'path') {\n throw new errors.BotpressCLIError('Cannot get local integration')\n }\n\n try {\n const integration = await api.findPublicOrPrivateIntegration(parsedRef)\n if (integration) {\n this.logger.success(`Integration ${chalk.bold(this.argv.integrationRef)}:`)\n this.logger.json(integration)\n return\n }\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get integration ${this.argv.integrationRef}`)\n }\n\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} not found`)\n }\n}\n\nexport type ListIntegrationsCommandDefinition = typeof commandDefinitions.integrations.subcommands.list\nexport class ListIntegrationsCommand extends GlobalCommand<ListIntegrationsCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n const { dev, public: isPublic, owned } = this.argv\n\n if (dev && isPublic) {\n throw new errors.BotpressCLIError(\n 'Cannot use --dev and --public flags together as dev integrations are always private'\n )\n }\n if (dev && owned) {\n throw new errors.BotpressCLIError(\n 'Cannot use --dev and --owned flags together as dev integrations are always owned by the current workspace'\n )\n }\n\n try {\n const integrations = await this._listAllIntegrations(api)\n this.logger.success('Integrations:')\n this.logger.json(integrations)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list integrations')\n }\n }\n\n private _listAllIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n if (this.argv.dev) {\n return this._listDevIntegrations(api)\n }\n\n if (this.argv.public && this.argv.owned) {\n const [owned, publicIntegrations] = await Promise.all([\n this._listOwnedIntegrations(api),\n this._listPublicIntegrations(api),\n ])\n return _.intersectionBy(owned, publicIntegrations, (i) => i.id).slice(0, this.argv.limit)\n }\n\n if (this.argv.owned) {\n return this._listOwnedIntegrations(api)\n }\n\n if (this.argv.public) {\n return this._listPublicIntegrations(api)\n }\n\n const [owned, publicIntegrations] = await Promise.all([\n this._listOwnedIntegrations(api),\n this._listPublicIntegrations(api),\n ])\n return _.uniqBy([...owned, ...publicIntegrations], (i) => i.id).slice(0, this.argv.limit)\n }\n\n private _listDevIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.integrations({ dev: true, name, version }).collect({ limit: this.argv.limit })\n }\n\n private _listOwnedIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.integrations({ name, version }).collect({ limit: this.argv.limit })\n }\n\n private _listPublicIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.publicIntegrations({ name, version }).collect({ limit: this.argv.limit })\n }\n}\n\nexport type DeleteIntegrationCommandDefinition = typeof commandDefinitions.integrations.subcommands.delete\nexport class DeleteIntegrationCommand extends GlobalCommand<DeleteIntegrationCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const parsedRef = parsePackageRef(this.argv.integrationRef)\n if (!parsedRef) {\n throw new errors.InvalidPackageReferenceError(this.argv.integrationRef)\n }\n if (parsedRef.type === 'path') {\n throw new errors.BotpressCLIError('Cannot delete local integration')\n }\n\n let integrationId: string | undefined\n if (parsedRef.type === 'id') {\n integrationId = parsedRef.id\n } else {\n const integration = await this._findIntegration(api, parsedRef)\n integrationId = integration.id\n }\n\n try {\n await api.client.deleteIntegration({ id: integrationId })\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not delete integration ${this.argv.integrationRef}`)\n }\n\n this.logger.success(`Integration ${chalk.bold(this.argv.integrationRef)} deleted`)\n return\n }\n\n private _findIntegration = async (api: ApiClient, parsedRef: NamePackageRef) => {\n let integration: PublicOrPrivateIntegration | undefined\n\n try {\n integration = await api.findPrivateIntegration(parsedRef)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get integration ${this.argv.integrationRef}`)\n }\n\n if (!integration) {\n const publicIntegration = await api.findPublicIntegration(parsedRef)\n if (publicIntegration) {\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} does not belong to your workspace`)\n }\n\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} not found`)\n }\n\n return integration\n }\n}\n"],
4
+ "sourcesContent": ["import chalk from 'chalk'\nimport _ from 'lodash'\nimport { ApiClient, PublicOrPrivateIntegration, IntegrationSummary } from '../api/client'\nimport type commandDefinitions from '../command-definitions'\nimport * as errors from '../errors'\nimport { NamePackageRef, parsePackageRef } from '../package-ref'\nimport { GlobalCommand } from './global-command'\n\nexport type GetIntegrationCommandDefinition = typeof commandDefinitions.integrations.subcommands.get\nexport class GetIntegrationCommand extends GlobalCommand<GetIntegrationCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const parsedRef = parsePackageRef(this.argv.integrationRef)\n if (!parsedRef) {\n throw new errors.InvalidPackageReferenceError(this.argv.integrationRef)\n }\n if (parsedRef.type === 'path') {\n throw new errors.BotpressCLIError('Cannot get local integration')\n }\n\n try {\n const integration = await api.findPublicOrPrivateIntegration(parsedRef)\n if (integration) {\n this.logger.success(`Integration ${chalk.bold(this.argv.integrationRef)}:`)\n this.logger.json(integration)\n return\n }\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get integration ${this.argv.integrationRef}`)\n }\n\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} not found`)\n }\n}\n\nexport type ListIntegrationsCommandDefinition = typeof commandDefinitions.integrations.subcommands.list\nexport class ListIntegrationsCommand extends GlobalCommand<ListIntegrationsCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n\n const { dev, public: isPublic, owned } = this.argv\n\n if (dev && isPublic) {\n throw new errors.BotpressCLIError(\n 'Cannot use --dev and --public flags together as dev integrations are always private'\n )\n }\n if (dev && owned) {\n throw new errors.BotpressCLIError(\n 'Cannot use --dev and --owned flags together as dev integrations are always owned by the current workspace'\n )\n }\n\n try {\n const integrations = await this._listAllIntegrations(api)\n this.logger.success('Integrations:')\n this.logger.json(integrations)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, 'Could not list integrations')\n }\n }\n\n private _listAllIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n if (this.argv.dev) {\n return this._listDevIntegrations(api)\n }\n\n if (this.argv.public && this.argv.owned) {\n const [owned, publicIntegrations] = await Promise.all([\n this._listOwnedIntegrations(api),\n this._listPublicIntegrations(api),\n ])\n return _.intersectionBy(owned, publicIntegrations, (i) => i.id).slice(0, this.argv.limit)\n }\n\n if (this.argv.owned) {\n return this._listOwnedIntegrations(api)\n }\n\n if (this.argv.public) {\n return this._listPublicIntegrations(api)\n }\n\n const [owned, publicIntegrations] = await Promise.all([\n this._listOwnedIntegrations(api),\n this._listPublicIntegrations(api),\n ])\n return _.uniqBy([...owned, ...publicIntegrations], (i) => i.id).slice(0, this.argv.limit)\n }\n\n private _listDevIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.integrations({ dev: true, name, version }).collect({ limit: this.argv.limit })\n }\n\n private _listOwnedIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.integrations({ name, version }).collect({ limit: this.argv.limit })\n }\n\n private _listPublicIntegrations = async (api: ApiClient): Promise<IntegrationSummary[]> => {\n const { name, versionNumber: version } = this.argv\n return api.client.list.publicIntegrations({ name, version }).collect({ limit: this.argv.limit })\n }\n}\n\nexport type DeleteIntegrationCommandDefinition = typeof commandDefinitions.integrations.subcommands.delete\nexport class DeleteIntegrationCommand extends GlobalCommand<DeleteIntegrationCommandDefinition> {\n public async run(): Promise<void> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n const parsedRef = parsePackageRef(this.argv.integrationRef)\n if (!parsedRef) {\n throw new errors.InvalidPackageReferenceError(this.argv.integrationRef)\n }\n if (parsedRef.type === 'path') {\n throw new errors.BotpressCLIError('Cannot delete local integration')\n }\n\n let integrationId: string | undefined\n if (parsedRef.type === 'id') {\n integrationId = parsedRef.id\n } else {\n const integration = await this._findIntegration(api, parsedRef)\n integrationId = integration.id\n }\n\n try {\n await api.client.deleteIntegration({ id: integrationId })\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not delete integration ${this.argv.integrationRef}`)\n }\n\n this.logger.success(`Integration ${chalk.bold(this.argv.integrationRef)} deleted`)\n return\n }\n\n private _findIntegration = async (api: ApiClient, parsedRef: NamePackageRef) => {\n let integration: PublicOrPrivateIntegration | undefined\n\n try {\n integration = await api.findPrivateIntegration(parsedRef)\n } catch (thrown) {\n throw errors.BotpressCLIError.wrap(thrown, `Could not get integration ${this.argv.integrationRef}`)\n }\n\n if (!integration) {\n const publicIntegration = await api.findPublicIntegration(parsedRef)\n if (publicIntegration) {\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} does not belong to your workspace`)\n }\n\n throw new errors.BotpressCLIError(`Integration ${this.argv.integrationRef} not found`)\n }\n\n return integration\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["chalk", "owned", "publicIntegrations", "_"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "6.3.4",
3
+ "version": "6.4.0",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run build:types && pnpm run bundle && pnpm run template:gen",
@@ -27,8 +27,8 @@
27
27
  "dependencies": {
28
28
  "@apidevtools/json-schema-ref-parser": "^11.7.0",
29
29
  "@botpress/chat": "0.5.5",
30
- "@botpress/client": "1.40.0",
31
- "@botpress/sdk": "6.4.5",
30
+ "@botpress/client": "1.41.0",
31
+ "@botpress/sdk": "6.6.0",
32
32
  "@bpinternal/const": "^0.1.0",
33
33
  "@bpinternal/tunnel": "^0.1.1",
34
34
  "@bpinternal/verel": "^0.2.0",
@@ -5,8 +5,8 @@
5
5
  },
6
6
  "private": true,
7
7
  "dependencies": {
8
- "@botpress/client": "1.40.0",
9
- "@botpress/sdk": "6.4.5"
8
+ "@botpress/client": "1.41.0",
9
+ "@botpress/sdk": "6.6.0"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.16.4",
@@ -15,7 +15,7 @@
15
15
  "noUncheckedIndexedAccess": true,
16
16
  "noUnusedParameters": true,
17
17
  "target": "es2017",
18
- "baseUrl": ".",
18
+ "paths": { "*": ["./*"] },
19
19
  "outDir": "dist",
20
20
  "checkJs": false,
21
21
  "exactOptionalPropertyTypes": false,
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "1.40.0",
10
- "@botpress/sdk": "6.4.5"
9
+ "@botpress/client": "1.41.0",
10
+ "@botpress/sdk": "6.6.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^22.16.4",
@@ -15,7 +15,7 @@
15
15
  "noUncheckedIndexedAccess": true,
16
16
  "noUnusedParameters": true,
17
17
  "target": "es2017",
18
- "baseUrl": ".",
18
+ "paths": { "*": ["./*"] },
19
19
  "outDir": "dist",
20
20
  "checkJs": false,
21
21
  "exactOptionalPropertyTypes": false,
@@ -6,7 +6,7 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/sdk": "6.4.5"
9
+ "@botpress/sdk": "6.6.0"
10
10
  },
11
11
  "devDependencies": {
12
12
  "@types/node": "^22.16.4",
@@ -15,7 +15,7 @@
15
15
  "noUncheckedIndexedAccess": true,
16
16
  "noUnusedParameters": true,
17
17
  "target": "es2017",
18
- "baseUrl": ".",
18
+ "paths": { "*": ["./*"] },
19
19
  "outDir": "dist",
20
20
  "checkJs": false,
21
21
  "exactOptionalPropertyTypes": false,
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "1.40.0",
10
- "@botpress/sdk": "6.4.5"
9
+ "@botpress/client": "1.41.0",
10
+ "@botpress/sdk": "6.6.0"
11
11
  },
12
12
  "devDependencies": {
13
13
  "@types/node": "^22.16.4",
@@ -15,7 +15,7 @@
15
15
  "noUncheckedIndexedAccess": true,
16
16
  "noUnusedParameters": true,
17
17
  "target": "es2017",
18
- "baseUrl": ".",
18
+ "paths": { "*": ["./*"] },
19
19
  "outDir": "dist",
20
20
  "checkJs": false,
21
21
  "exactOptionalPropertyTypes": false,
@@ -6,8 +6,8 @@
6
6
  },
7
7
  "private": true,
8
8
  "dependencies": {
9
- "@botpress/client": "1.40.0",
10
- "@botpress/sdk": "6.4.5",
9
+ "@botpress/client": "1.41.0",
10
+ "@botpress/sdk": "6.6.0",
11
11
  "axios": "^1.6.8"
12
12
  },
13
13
  "devDependencies": {
@@ -15,7 +15,7 @@
15
15
  "noUncheckedIndexedAccess": true,
16
16
  "noUnusedParameters": true,
17
17
  "target": "es2017",
18
- "baseUrl": ".",
18
+ "paths": { "*": ["./*"] },
19
19
  "outDir": "dist",
20
20
  "checkJs": false,
21
21
  "exactOptionalPropertyTypes": false,
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "extends": "../../tsconfig.json",
3
3
  "compilerOptions": {
4
- "baseUrl": ".",
5
4
  "rootDir": "src",
6
5
  "outDir": "dist",
7
6
  "declaration": true,