@botpress/cli 4.14.6 → 4.15.1

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,32 +1,32 @@
1
1
 
2
- > @botpress/cli@4.14.6 build /home/runner/work/botpress/botpress/packages/cli
2
+ > @botpress/cli@4.15.1 build /home/runner/work/botpress/botpress/packages/cli
3
3
  > pnpm run bundle && pnpm run template:gen
4
4
 
5
5
 
6
- > @botpress/cli@4.14.6 bundle /home/runner/work/botpress/botpress/packages/cli
6
+ > @botpress/cli@4.15.1 bundle /home/runner/work/botpress/botpress/packages/cli
7
7
  > ts-node -T build.ts
8
8
 
9
9
 
10
- > @botpress/cli@4.14.6 template:gen /home/runner/work/botpress/botpress/packages/cli
10
+ > @botpress/cli@4.15.1 template:gen /home/runner/work/botpress/botpress/packages/cli
11
11
  > pnpm -r --stream -F @bp-templates/* exec bp gen
12
12
 
13
- 🤖 Botpress CLI v4.14.6
14
- 🤖 Botpress CLI v4.14.6
15
- 🤖 Botpress CLI v4.14.6
16
- 🤖 Botpress CLI v4.14.6
17
- ○ Generating typings for integration hello-world...
18
- ○ Generating typings for plugin empty-plugin...
13
+ 🤖 Botpress CLI v4.15.1
14
+ 🤖 Botpress CLI v4.15.1
15
+ 🤖 Botpress CLI v4.15.1
16
+ 🤖 Botpress CLI v4.15.1
17
+ ○ Generating typings for bot...
19
18
  ✓ Typings available at .botpress
20
19
 
20
+ ○ Generating typings for integration hello-world...
21
21
  ○ Generating typings for integration empty-integration...
22
22
  ✓ Typings available at .botpress
23
23
 
24
+ ○ Generating typings for plugin empty-plugin...
24
25
  ✓ Typings available at .botpress
25
26
 
26
- ○ Generating typings for bot...
27
27
  ✓ Typings available at .botpress
28
28
 
29
- 🤖 Botpress CLI v4.14.6
29
+ 🤖 Botpress CLI v4.15.1
30
30
  ○ Generating typings for integration webhook-message...
31
31
  ✓ Typings available at .botpress
32
32
 
@@ -33,9 +33,10 @@ __export(client_exports, {
33
33
  });
34
34
  module.exports = __toCommonJS(client_exports);
35
35
  var client = __toESM(require("@botpress/client"));
36
+ var import_semver = __toESM(require("semver"));
36
37
  var import_yn = __toESM(require("yn"));
38
+ var errors = __toESM(require("../errors"));
37
39
  var import_package_ref = require("../package-ref");
38
- var import_find_previous_version = require("./find-previous-version");
39
40
  var paging = __toESM(require("./paging"));
40
41
  var retry = __toESM(require("./retry"));
41
42
  __reExport(client_exports, require("./types"), module.exports);
@@ -72,6 +73,15 @@ class ApiClient {
72
73
  "11111111-1111-1111-aaaa-111111111111"
73
74
  ].includes(this.workspaceId);
74
75
  }
76
+ async safeListTables(req) {
77
+ try {
78
+ const result = await this.client.listTables(req);
79
+ return { success: true, tables: result.tables };
80
+ } catch (thrown) {
81
+ const error = thrown instanceof Error ? thrown : new Error(String(thrown));
82
+ return { success: false, error };
83
+ }
84
+ }
75
85
  async getWorkspace() {
76
86
  return this.client.getWorkspace({ id: this.workspaceId });
77
87
  }
@@ -198,11 +208,11 @@ class ApiClient {
198
208
  }
199
209
  listAllPages = paging.listAllPages;
200
210
  async findPreviousIntegrationVersion(ref) {
201
- const previous = await (0, import_find_previous_version.findPreviousIntegrationVersion)(this.client, ref);
202
- if (!previous) {
203
- return;
211
+ const isValidSemverVersion = import_semver.default.valid(ref.version);
212
+ if (!isValidSemverVersion) {
213
+ throw new errors.BotpressCLIError(`Invalid version "${ref.version}" for integration "${ref.name}"`);
204
214
  }
205
- return this.findPublicOrPrivateIntegration({ type: "id", id: previous.id });
215
+ return this.findPublicOrPrivateIntegration({ ...ref, version: `<${ref.version}` });
206
216
  }
207
217
  async findBotByName(name) {
208
218
  const allBots = await this.listAllPages(this.client.listBots, (r) => r.bots);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/client.ts"],
4
- "sourcesContent": ["import * as client from '@botpress/client'\nimport yn from 'yn'\nimport type { Logger } from '../logger'\nimport { formatPackageRef, ApiPackageRef, NamePackageRef } from '../package-ref'\nimport * as utils from '../utils'\nimport { findPreviousIntegrationVersion } from './find-previous-version'\nimport * as paging from './paging'\nimport * as retry from './retry'\n\nimport {\n ApiClientProps,\n PublicOrUnlistedIntegration,\n PrivateIntegration,\n PublicOrPrivateIntegration,\n PublicInterface,\n PrivateInterface,\n PublicOrPrivateInterface,\n PrivatePlugin,\n PublicPlugin,\n PublicOrPrivatePlugin,\n BotSummary,\n} from './types'\n\nexport * from './types'\n\n/**\n * This class is used to wrap the Botpress API and provide a more convenient way to interact with it.\n */\nexport class ApiClient {\n public readonly client: client.Client\n public readonly url: string\n public readonly token: string\n public readonly workspaceId: string\n public readonly botId?: string\n\n public static newClient = (props: ApiClientProps, logger: Logger) => new ApiClient(props, logger)\n\n public constructor(\n props: ApiClientProps,\n private _logger: Logger\n ) {\n const { apiUrl, token, workspaceId, botId } = props\n this.client = new client.Client({\n apiUrl,\n token,\n workspaceId,\n botId,\n retry: retry.config,\n })\n this.url = apiUrl\n this.token = token\n this.workspaceId = workspaceId\n this.botId = botId\n }\n\n public get isBotpressWorkspace(): boolean {\n // this environment variable is undocumented and only used internally for dev purposes\n const isBotpressWorkspace = yn(process.env.BP_IS_BOTPRESS_WORKSPACE)\n if (isBotpressWorkspace !== undefined) {\n return isBotpressWorkspace\n }\n return [\n '6a76fa10-e150-4ff6-8f59-a300feec06c1',\n '95de33eb-1551-4af9-9088-e5dcb02efd09',\n '11111111-1111-1111-aaaa-111111111111',\n ].includes(this.workspaceId)\n }\n\n public async getWorkspace(): Promise<client.ClientOutputs['getWorkspace']> {\n return this.client.getWorkspace({ id: this.workspaceId })\n }\n\n public async findWorkspaceByHandle(handle: string): Promise<client.ClientOutputs['getWorkspace'] | undefined> {\n const { workspaces } = await this.client.listWorkspaces({ handle })\n return workspaces[0] // There should be only one workspace with a given handle\n }\n\n public switchWorkspace(workspaceId: string): ApiClient {\n return ApiClient.newClient({ apiUrl: this.url, token: this.token, workspaceId }, this._logger)\n }\n\n public switchBot(botId: string): ApiClient {\n return ApiClient.newClient(\n { apiUrl: this.url, token: this.token, botId, workspaceId: this.workspaceId },\n this._logger\n )\n }\n\n public async updateWorkspace(\n props: utils.types.SafeOmit<client.ClientInputs['updateWorkspace'], 'id'>\n ): Promise<client.ClientOutputs['updateWorkspace']> {\n return this.client.updateWorkspace({ id: this.workspaceId, ...props })\n }\n\n public async getPublicOrPrivateIntegration(ref: ApiPackageRef): Promise<PublicOrPrivateIntegration> {\n const integration = await this.findPublicOrPrivateIntegration(ref)\n if (!integration) {\n throw new Error(`Integration \"${formatPackageRef(ref)}\" not found`)\n }\n return integration\n }\n\n public async findPublicOrPrivateIntegration(ref: ApiPackageRef): Promise<PublicOrPrivateIntegration | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateIntegration = await this.findPrivateIntegration(ref)\n if (privateIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in workspace`)\n return privateIntegration\n }\n\n const publicIntegration = await this.findPublicIntegration(ref)\n if (publicIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in hub`)\n return publicIntegration\n }\n\n return\n }\n\n public async findPrivateIntegration(ref: ApiPackageRef): Promise<PrivateIntegration | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getIntegration(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getIntegrationByName(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicIntegration(ref: ApiPackageRef): Promise<PublicOrUnlistedIntegration | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicIntegrationById(ref)\n .then((r) => ({ ...r.integration, visibility: r.integration.visibility as 'public' | 'unlisted' }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPublicIntegration(ref)\n .then((r) => ({ ...r.integration, visibility: r.integration.visibility as 'public' | 'unlisted' }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicOrPrivateInterface(ref: ApiPackageRef): Promise<PublicOrPrivateInterface | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateInterface = await this.findPrivateInterface(ref)\n if (privateInterface) {\n this._logger.debug(`Found interface \"${formatted}\" in workspace`)\n return privateInterface\n }\n\n const publicInterface = await this.findPublicInterface(ref)\n if (publicInterface) {\n this._logger.debug(`Found interface \"${formatted}\" in hub`)\n return publicInterface\n }\n\n return\n }\n\n public async findPrivateInterface(ref: ApiPackageRef): Promise<PrivateInterface | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getInterface(ref)\n .then((r) => ({ ...r.interface, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getInterfaceByName(ref)\n .then((r) => ({ ...r.interface, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicInterface(ref: ApiPackageRef): Promise<PublicInterface> {\n const intrface = await this.findPublicInterface(ref)\n if (!intrface) {\n throw new Error(`Interface \"${formatPackageRef(ref)}\" not found`)\n }\n return intrface\n }\n\n public async findPublicInterface(ref: ApiPackageRef): Promise<PublicInterface | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicInterfaceById(ref)\n .then((r) => ({ ...r.interface, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n return this.client\n .getPublicInterface(ref)\n .then((r) => ({ ...r.interface, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicPlugin(ref: ApiPackageRef): Promise<PublicPlugin | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicPluginById(ref)\n .then((r) => ({ ...r.plugin, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n return this.client\n .getPublicPlugin(ref)\n .then((r) => ({ ...r.plugin, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicOrPrivatePlugin(ref: ApiPackageRef): Promise<PublicOrPrivatePlugin> {\n const plugin = await this.findPublicOrPrivatePlugin(ref)\n if (!plugin) {\n throw new Error(`Plugin \"${formatPackageRef(ref)}\" not found`)\n }\n return plugin\n }\n\n public async findPublicOrPrivatePlugin(ref: ApiPackageRef): Promise<PublicOrPrivatePlugin | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privatePlugin = await this.findPrivatePlugin(ref)\n if (privatePlugin) {\n this._logger.debug(`Found plugin \"${formatted}\" in workspace`)\n return privatePlugin\n }\n\n const publicPlugin = await this.findPublicPlugin(ref)\n if (publicPlugin) {\n this._logger.debug(`Found plugin \"${formatted}\" in hub`)\n return publicPlugin\n }\n\n return\n }\n\n public async findPrivatePlugin(ref: ApiPackageRef): Promise<PrivatePlugin | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getPlugin(ref)\n .then((r) => ({ ...r.plugin, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPluginByName(ref)\n .then((r) => ({ ...r.plugin, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async testLogin(): Promise<void> {\n await this.client.listBots({})\n }\n\n public listAllPages = paging.listAllPages\n\n public async findPreviousIntegrationVersion(ref: NamePackageRef): Promise<PublicOrPrivateIntegration | undefined> {\n const previous = await findPreviousIntegrationVersion(this.client, ref)\n if (!previous) {\n return\n }\n return this.findPublicOrPrivateIntegration({ type: 'id', id: previous.id })\n }\n\n public async findBotByName(name: string): Promise<BotSummary | undefined> {\n // api does not allow filtering bots by name\n const allBots = await this.listAllPages(this.client.listBots, (r) => r.bots)\n return allBots.find((b) => b.name === name)\n }\n\n private _returnUndefinedOnError =\n (type: client.ApiError['type']) =>\n (thrown: any): undefined => {\n if (client.isApiError(thrown) && thrown.type === type) {\n return\n }\n throw thrown\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["yn"]
4
+ "sourcesContent": ["import * as client from '@botpress/client'\nimport semver from 'semver'\nimport yn from 'yn'\nimport * as errors from '../errors'\nimport type { Logger } from '../logger'\nimport { formatPackageRef, ApiPackageRef, NamePackageRef } from '../package-ref'\nimport * as utils from '../utils'\nimport * as paging from './paging'\nimport * as retry from './retry'\n\nimport {\n ApiClientProps,\n PublicOrUnlistedIntegration,\n PrivateIntegration,\n PublicOrPrivateIntegration,\n PublicInterface,\n PrivateInterface,\n PublicOrPrivateInterface,\n PrivatePlugin,\n PublicPlugin,\n PublicOrPrivatePlugin,\n BotSummary,\n} from './types'\n\nexport * from './types'\n\n/**\n * This class is used to wrap the Botpress API and provide a more convenient way to interact with it.\n */\nexport class ApiClient {\n public readonly client: client.Client\n public readonly url: string\n public readonly token: string\n public readonly workspaceId: string\n public readonly botId?: string\n\n public static newClient = (props: ApiClientProps, logger: Logger) => new ApiClient(props, logger)\n\n public constructor(\n props: ApiClientProps,\n private _logger: Logger\n ) {\n const { apiUrl, token, workspaceId, botId } = props\n this.client = new client.Client({\n apiUrl,\n token,\n workspaceId,\n botId,\n retry: retry.config,\n })\n this.url = apiUrl\n this.token = token\n this.workspaceId = workspaceId\n this.botId = botId\n }\n\n public get isBotpressWorkspace(): boolean {\n // this environment variable is undocumented and only used internally for dev purposes\n const isBotpressWorkspace = yn(process.env.BP_IS_BOTPRESS_WORKSPACE)\n if (isBotpressWorkspace !== undefined) {\n return isBotpressWorkspace\n }\n return [\n '6a76fa10-e150-4ff6-8f59-a300feec06c1',\n '95de33eb-1551-4af9-9088-e5dcb02efd09',\n '11111111-1111-1111-aaaa-111111111111',\n ].includes(this.workspaceId)\n }\n\n public async safeListTables(req: client.ClientInputs['listTables']): Promise<\n | {\n success: true\n tables: client.ClientOutputs['listTables']['tables']\n }\n | {\n success: false\n error: Error\n }\n > {\n try {\n const result = await this.client.listTables(req)\n return { success: true, tables: result.tables }\n } catch (thrown) {\n const error = thrown instanceof Error ? thrown : new Error(String(thrown))\n return { success: false, error }\n }\n }\n\n public async getWorkspace(): Promise<client.ClientOutputs['getWorkspace']> {\n return this.client.getWorkspace({ id: this.workspaceId })\n }\n\n public async findWorkspaceByHandle(handle: string): Promise<client.ClientOutputs['getWorkspace'] | undefined> {\n const { workspaces } = await this.client.listWorkspaces({ handle })\n return workspaces[0] // There should be only one workspace with a given handle\n }\n\n public switchWorkspace(workspaceId: string): ApiClient {\n return ApiClient.newClient({ apiUrl: this.url, token: this.token, workspaceId }, this._logger)\n }\n\n public switchBot(botId: string): ApiClient {\n return ApiClient.newClient(\n { apiUrl: this.url, token: this.token, botId, workspaceId: this.workspaceId },\n this._logger\n )\n }\n\n public async updateWorkspace(\n props: utils.types.SafeOmit<client.ClientInputs['updateWorkspace'], 'id'>\n ): Promise<client.ClientOutputs['updateWorkspace']> {\n return this.client.updateWorkspace({ id: this.workspaceId, ...props })\n }\n\n public async getPublicOrPrivateIntegration(ref: ApiPackageRef): Promise<PublicOrPrivateIntegration> {\n const integration = await this.findPublicOrPrivateIntegration(ref)\n if (!integration) {\n throw new Error(`Integration \"${formatPackageRef(ref)}\" not found`)\n }\n return integration\n }\n\n public async findPublicOrPrivateIntegration(ref: ApiPackageRef): Promise<PublicOrPrivateIntegration | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateIntegration = await this.findPrivateIntegration(ref)\n if (privateIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in workspace`)\n return privateIntegration\n }\n\n const publicIntegration = await this.findPublicIntegration(ref)\n if (publicIntegration) {\n this._logger.debug(`Found integration \"${formatted}\" in hub`)\n return publicIntegration\n }\n\n return\n }\n\n public async findPrivateIntegration(ref: ApiPackageRef): Promise<PrivateIntegration | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getIntegration(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getIntegrationByName(ref)\n .then((r) => ({ ...r.integration, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicIntegration(ref: ApiPackageRef): Promise<PublicOrUnlistedIntegration | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicIntegrationById(ref)\n .then((r) => ({ ...r.integration, visibility: r.integration.visibility as 'public' | 'unlisted' }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPublicIntegration(ref)\n .then((r) => ({ ...r.integration, visibility: r.integration.visibility as 'public' | 'unlisted' }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicOrPrivateInterface(ref: ApiPackageRef): Promise<PublicOrPrivateInterface | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privateInterface = await this.findPrivateInterface(ref)\n if (privateInterface) {\n this._logger.debug(`Found interface \"${formatted}\" in workspace`)\n return privateInterface\n }\n\n const publicInterface = await this.findPublicInterface(ref)\n if (publicInterface) {\n this._logger.debug(`Found interface \"${formatted}\" in hub`)\n return publicInterface\n }\n\n return\n }\n\n public async findPrivateInterface(ref: ApiPackageRef): Promise<PrivateInterface | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getInterface(ref)\n .then((r) => ({ ...r.interface, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getInterfaceByName(ref)\n .then((r) => ({ ...r.interface, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicInterface(ref: ApiPackageRef): Promise<PublicInterface> {\n const intrface = await this.findPublicInterface(ref)\n if (!intrface) {\n throw new Error(`Interface \"${formatPackageRef(ref)}\" not found`)\n }\n return intrface\n }\n\n public async findPublicInterface(ref: ApiPackageRef): Promise<PublicInterface | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicInterfaceById(ref)\n .then((r) => ({ ...r.interface, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n return this.client\n .getPublicInterface(ref)\n .then((r) => ({ ...r.interface, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async findPublicPlugin(ref: ApiPackageRef): Promise<PublicPlugin | undefined> {\n if (ref.type === 'id') {\n return this.client\n .getPublicPluginById(ref)\n .then((r) => ({ ...r.plugin, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n return this.client\n .getPublicPlugin(ref)\n .then((r) => ({ ...r.plugin, public: true }) as const)\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async getPublicOrPrivatePlugin(ref: ApiPackageRef): Promise<PublicOrPrivatePlugin> {\n const plugin = await this.findPublicOrPrivatePlugin(ref)\n if (!plugin) {\n throw new Error(`Plugin \"${formatPackageRef(ref)}\" not found`)\n }\n return plugin\n }\n\n public async findPublicOrPrivatePlugin(ref: ApiPackageRef): Promise<PublicOrPrivatePlugin | undefined> {\n const formatted = formatPackageRef(ref)\n\n const privatePlugin = await this.findPrivatePlugin(ref)\n if (privatePlugin) {\n this._logger.debug(`Found plugin \"${formatted}\" in workspace`)\n return privatePlugin\n }\n\n const publicPlugin = await this.findPublicPlugin(ref)\n if (publicPlugin) {\n this._logger.debug(`Found plugin \"${formatted}\" in hub`)\n return publicPlugin\n }\n\n return\n }\n\n public async findPrivatePlugin(ref: ApiPackageRef): Promise<PrivatePlugin | undefined> {\n const { workspaceId } = this\n if (ref.type === 'id') {\n return this.client\n .getPlugin(ref)\n .then((r) => ({ ...r.plugin, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n return this.client\n .getPluginByName(ref)\n .then((r) => ({ ...r.plugin, workspaceId }))\n .catch(this._returnUndefinedOnError('ResourceNotFound'))\n }\n\n public async testLogin(): Promise<void> {\n await this.client.listBots({})\n }\n\n public listAllPages = paging.listAllPages\n\n public async findPreviousIntegrationVersion(ref: NamePackageRef): Promise<PublicOrPrivateIntegration | undefined> {\n const isValidSemverVersion = semver.valid(ref.version)\n\n // Sanity check (this should never happen):\n if (!isValidSemverVersion) {\n throw new errors.BotpressCLIError(`Invalid version \"${ref.version}\" for integration \"${ref.name}\"`)\n }\n\n return this.findPublicOrPrivateIntegration({ ...ref, version: `<${ref.version}` })\n }\n\n public async findBotByName(name: string): Promise<BotSummary | undefined> {\n // api does not allow filtering bots by name\n const allBots = await this.listAllPages(this.client.listBots, (r) => r.bots)\n return allBots.find((b) => b.name === name)\n }\n\n private _returnUndefinedOnError =\n (type: client.ApiError['type']) =>\n (thrown: any): undefined => {\n if (client.isApiError(thrown) && thrown.type === type) {\n return\n }\n throw thrown\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["yn", "semver"]
7
7
  }
@@ -83,6 +83,16 @@ const prepareUpdatePluginBody = (localPlugin, remotePlugin) => {
83
83
  });
84
84
  const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states);
85
85
  const attributes = utils.records.setNullOnMissingValues(localPlugin.attributes, remotePlugin.attributes);
86
+ const dependencies = {
87
+ integrations: utils.records.setNullOnMissingValues(
88
+ localPlugin.dependencies?.integrations,
89
+ remotePlugin.dependencies?.integrations
90
+ ),
91
+ interfaces: utils.records.setNullOnMissingValues(
92
+ localPlugin.dependencies?.interfaces,
93
+ remotePlugin.dependencies?.interfaces
94
+ )
95
+ };
86
96
  return {
87
97
  ...localPlugin,
88
98
  actions,
@@ -90,7 +100,8 @@ const prepareUpdatePluginBody = (localPlugin, remotePlugin) => {
90
100
  states,
91
101
  user: localPlugin.user,
92
102
  // TODO: allow deleting user tags with null
93
- attributes
103
+ attributes,
104
+ dependencies
94
105
  };
95
106
  };
96
107
  // Annotate the CommonJS export names for ESM import in node:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/api/plugin-body.ts"],
4
- "sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (\n plugin: sdk.PluginDefinition | sdk.PluginPackage['definition']\n): Promise<types.CreatePluginRequestBody> => ({\n name: plugin.name,\n version: plugin.version,\n title: 'title' in plugin ? plugin.title : undefined,\n description: 'description' in plugin ? plugin.description : undefined,\n user: {\n tags: plugin.user?.tags ?? {},\n },\n conversation: {\n tags: plugin.conversation?.tags ?? {},\n },\n configuration: plugin.configuration\n ? {\n ...plugin.configuration,\n schema: await utils.schema.mapZodToJsonSchema(plugin.configuration),\n }\n : undefined,\n events: plugin.events\n ? await utils.records.mapValuesAsync(plugin.events, async (event) => ({\n ...event,\n schema: await utils.schema.mapZodToJsonSchema(event),\n }))\n : undefined,\n actions: plugin.actions\n ? await utils.records.mapValuesAsync(plugin.actions, async (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: await utils.schema.mapZodToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: await utils.schema.mapZodToJsonSchema(action.output),\n },\n }))\n : undefined,\n states: plugin.states\n ? (utils.records.filterValues(\n await utils.records.mapValuesAsync(plugin.states, async (state) => ({\n ...state,\n schema: await utils.schema.mapZodToJsonSchema(state),\n })),\n ({ type }) => type !== 'workflow'\n ) as types.CreatePluginRequestBody['states'])\n : undefined,\n attributes: plugin.attributes,\n})\n\nexport const prepareUpdatePluginBody = (\n localPlugin: types.UpdatePluginRequestBody,\n remotePlugin: client.Plugin\n): types.UpdatePluginRequestBody => {\n const actions = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions),\n remoteItems: remotePlugin.actions,\n })\n const events = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.events, remotePlugin.events),\n remoteItems: remotePlugin.events,\n })\n const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states)\n\n const attributes = utils.records.setNullOnMissingValues(localPlugin.attributes, remotePlugin.attributes)\n\n return {\n ...localPlugin,\n actions,\n events,\n states,\n user: localPlugin.user, // TODO: allow deleting user tags with null\n attributes,\n }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AAGhB,MAAM,0BAA0B,OACrC,YAC4C;AAAA,EAC5C,MAAM,OAAO;AAAA,EACb,SAAS,OAAO;AAAA,EAChB,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,EAC1C,aAAa,iBAAiB,SAAS,OAAO,cAAc;AAAA,EAC5D,MAAM;AAAA,IACJ,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,OAAO,cAAc,QAAQ,CAAC;AAAA,EACtC;AAAA,EACA,eAAe,OAAO,gBAClB;AAAA,IACE,GAAG,OAAO;AAAA,IACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,aAAa;AAAA,EACpE,IACA;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AAAA,EACJ,SAAS,OAAO,UACZ,MAAM,MAAM,QAAQ,eAAe,OAAO,SAAS,OAAO,YAAY;AAAA,IACpE,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,KAAK;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,MAAM;AAAA,IAC7D;AAAA,EACF,EAAE,IACF;AAAA,EACJ,QAAQ,OAAO,SACV,MAAM,QAAQ;AAAA,IACb,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,MAClE,GAAG;AAAA,MACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,IACrD,EAAE;AAAA,IACF,CAAC,EAAE,KAAK,MAAM,SAAS;AAAA,EACzB,IACA;AAAA,EACJ,YAAY,OAAO;AACrB;AAEO,MAAM,0BAA0B,CACrC,aACA,iBACkC;AAClC,QAAM,UAAU,MAAM,WAAW,2BAA2B;AAAA,IAC1D,YAAY,MAAM,QAAQ,uBAAuB,YAAY,SAAS,aAAa,OAAO;AAAA,IAC1F,aAAa,aAAa;AAAA,EAC5B,CAAC;AACD,QAAM,SAAS,MAAM,WAAW,2BAA2B;AAAA,IACzD,YAAY,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAAA,IACxF,aAAa,aAAa;AAAA,EAC5B,CAAC;AACD,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAE3F,QAAM,aAAa,MAAM,QAAQ,uBAAuB,YAAY,YAAY,aAAa,UAAU;AAEvG,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,YAAY;AAAA;AAAA,IAClB;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import * as client from '@botpress/client'\nimport * as sdk from '@botpress/sdk'\nimport * as utils from '../utils'\nimport * as types from './types'\n\nexport const prepareCreatePluginBody = async (\n plugin: sdk.PluginDefinition | sdk.PluginPackage['definition']\n): Promise<types.CreatePluginRequestBody> => ({\n name: plugin.name,\n version: plugin.version,\n title: 'title' in plugin ? plugin.title : undefined,\n description: 'description' in plugin ? plugin.description : undefined,\n user: {\n tags: plugin.user?.tags ?? {},\n },\n conversation: {\n tags: plugin.conversation?.tags ?? {},\n },\n configuration: plugin.configuration\n ? {\n ...plugin.configuration,\n schema: await utils.schema.mapZodToJsonSchema(plugin.configuration),\n }\n : undefined,\n events: plugin.events\n ? await utils.records.mapValuesAsync(plugin.events, async (event) => ({\n ...event,\n schema: await utils.schema.mapZodToJsonSchema(event),\n }))\n : undefined,\n actions: plugin.actions\n ? await utils.records.mapValuesAsync(plugin.actions, async (action) => ({\n ...action,\n input: {\n ...action.input,\n schema: await utils.schema.mapZodToJsonSchema(action.input),\n },\n output: {\n ...action.output,\n schema: await utils.schema.mapZodToJsonSchema(action.output),\n },\n }))\n : undefined,\n states: plugin.states\n ? (utils.records.filterValues(\n await utils.records.mapValuesAsync(plugin.states, async (state) => ({\n ...state,\n schema: await utils.schema.mapZodToJsonSchema(state),\n })),\n ({ type }) => type !== 'workflow'\n ) as types.CreatePluginRequestBody['states'])\n : undefined,\n attributes: plugin.attributes,\n})\n\nexport const prepareUpdatePluginBody = (\n localPlugin: types.UpdatePluginRequestBody,\n remotePlugin: client.Plugin\n): types.UpdatePluginRequestBody => {\n const actions = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.actions, remotePlugin.actions),\n remoteItems: remotePlugin.actions,\n })\n const events = utils.attributes.prepareAttributeUpdateBody({\n localItems: utils.records.setNullOnMissingValues(localPlugin.events, remotePlugin.events),\n remoteItems: remotePlugin.events,\n })\n const states = utils.records.setNullOnMissingValues(localPlugin.states, remotePlugin.states)\n\n const attributes = utils.records.setNullOnMissingValues(localPlugin.attributes, remotePlugin.attributes)\n\n const dependencies: types.UpdatePluginRequestBody['dependencies'] = {\n integrations: utils.records.setNullOnMissingValues(\n localPlugin.dependencies?.integrations,\n remotePlugin.dependencies?.integrations\n ),\n interfaces: utils.records.setNullOnMissingValues(\n localPlugin.dependencies?.interfaces,\n remotePlugin.dependencies?.interfaces\n ),\n }\n\n return {\n ...localPlugin,\n actions,\n events,\n states,\n user: localPlugin.user, // TODO: allow deleting user tags with null\n attributes,\n dependencies,\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,YAAuB;AAGhB,MAAM,0BAA0B,OACrC,YAC4C;AAAA,EAC5C,MAAM,OAAO;AAAA,EACb,SAAS,OAAO;AAAA,EAChB,OAAO,WAAW,SAAS,OAAO,QAAQ;AAAA,EAC1C,aAAa,iBAAiB,SAAS,OAAO,cAAc;AAAA,EAC5D,MAAM;AAAA,IACJ,MAAM,OAAO,MAAM,QAAQ,CAAC;AAAA,EAC9B;AAAA,EACA,cAAc;AAAA,IACZ,MAAM,OAAO,cAAc,QAAQ,CAAC;AAAA,EACtC;AAAA,EACA,eAAe,OAAO,gBAClB;AAAA,IACE,GAAG,OAAO;AAAA,IACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,aAAa;AAAA,EACpE,IACA;AAAA,EACJ,QAAQ,OAAO,SACX,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,IAClE,GAAG;AAAA,IACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,EACrD,EAAE,IACF;AAAA,EACJ,SAAS,OAAO,UACZ,MAAM,MAAM,QAAQ,eAAe,OAAO,SAAS,OAAO,YAAY;AAAA,IACpE,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,KAAK;AAAA,IAC5D;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,OAAO;AAAA,MACV,QAAQ,MAAM,MAAM,OAAO,mBAAmB,OAAO,MAAM;AAAA,IAC7D;AAAA,EACF,EAAE,IACF;AAAA,EACJ,QAAQ,OAAO,SACV,MAAM,QAAQ;AAAA,IACb,MAAM,MAAM,QAAQ,eAAe,OAAO,QAAQ,OAAO,WAAW;AAAA,MAClE,GAAG;AAAA,MACH,QAAQ,MAAM,MAAM,OAAO,mBAAmB,KAAK;AAAA,IACrD,EAAE;AAAA,IACF,CAAC,EAAE,KAAK,MAAM,SAAS;AAAA,EACzB,IACA;AAAA,EACJ,YAAY,OAAO;AACrB;AAEO,MAAM,0BAA0B,CACrC,aACA,iBACkC;AAClC,QAAM,UAAU,MAAM,WAAW,2BAA2B;AAAA,IAC1D,YAAY,MAAM,QAAQ,uBAAuB,YAAY,SAAS,aAAa,OAAO;AAAA,IAC1F,aAAa,aAAa;AAAA,EAC5B,CAAC;AACD,QAAM,SAAS,MAAM,WAAW,2BAA2B;AAAA,IACzD,YAAY,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAAA,IACxF,aAAa,aAAa;AAAA,EAC5B,CAAC;AACD,QAAM,SAAS,MAAM,QAAQ,uBAAuB,YAAY,QAAQ,aAAa,MAAM;AAE3F,QAAM,aAAa,MAAM,QAAQ,uBAAuB,YAAY,YAAY,aAAa,UAAU;AAEvG,QAAM,eAA8D;AAAA,IAClE,cAAc,MAAM,QAAQ;AAAA,MAC1B,YAAY,cAAc;AAAA,MAC1B,aAAa,cAAc;AAAA,IAC7B;AAAA,IACA,YAAY,MAAM,QAAQ;AAAA,MACxB,YAAY,cAAc;AAAA,MAC1B,aAAa,cAAc;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,YAAY;AAAA;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -90,7 +90,7 @@ const parseNamePackageRef = (ref) => {
90
90
  if (!name || !version) {
91
91
  return;
92
92
  }
93
- const cleanedVersion = version === LATEST_TAG ? version : import_semver.default.clean(version);
93
+ const cleanedVersion = version === LATEST_TAG ? version : import_semver.default.validRange(version);
94
94
  if (!cleanedVersion) {
95
95
  return;
96
96
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/package-ref.ts"],
4
- "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport semver from 'semver'\nimport * as utils from './utils'\n\ntype PackageType = sdk.Package['type']\nconst packageTypes: Record<PackageType, null> = {\n integration: null,\n interface: null,\n plugin: null,\n}\nconst isPackageType = (type: string): type is PackageType => type in packageTypes\n\nexport type UUIDPackageRef = {\n type: 'id'\n id: string\n}\n\nexport type NamePackageRef = {\n type: 'name'\n pkg?: PackageType\n name: string\n version: string\n}\n\nexport type LocalPackageRef = {\n type: 'path'\n path: string\n}\n\nexport type ApiPackageRef = UUIDPackageRef | NamePackageRef\nexport type PackageRef = ApiPackageRef | LocalPackageRef\n\nconst LATEST_TAG = 'latest'\n\nexport const formatPackageRef = (ref: PackageRef): string => {\n if (ref.type === 'path') {\n return ref.path\n }\n if (ref.type === 'id') {\n return ref.id\n }\n if (ref.pkg) {\n return `${ref.pkg}:${ref.name}@${ref.version}`\n }\n return `${ref.name}@${ref.version}`\n}\n\nexport const parsePackageRef = (ref: string): PackageRef | undefined => {\n if (!ref) {\n return\n }\n\n if (utils.id.isValidID(ref)) {\n return { type: 'id', id: ref }\n }\n\n if (utils.path.isPath(ref)) {\n return { type: 'path', path: ref }\n }\n\n return parseNamePackageRef(ref)\n}\n\nconst parseNamePackageRef = (ref: string): NamePackageRef | undefined => {\n if (!ref) {\n return\n }\n\n if (ref.includes(':')) {\n const [pkg, nameVersion] = ref.split(':')\n if (!pkg || !nameVersion) {\n return\n }\n if (!isPackageType(pkg)) {\n return\n }\n const parsed = parseNamePackageRef(nameVersion)\n if (!parsed) {\n return\n }\n return { ...parsed, pkg }\n }\n\n if (!ref.includes('@')) {\n return { type: 'name', name: ref, version: LATEST_TAG }\n }\n\n const [name, version] = ref.split('@')\n if (!name || !version) {\n return\n }\n\n const cleanedVersion = version === LATEST_TAG ? version : semver.clean(version)\n if (!cleanedVersion) {\n return\n }\n\n return { type: 'name', name, version: cleanedVersion }\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmB;AACnB,YAAuB;AAGvB,MAAM,eAA0C;AAAA,EAC9C,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AACV;AACA,MAAM,gBAAgB,CAAC,SAAsC,QAAQ;AAsBrE,MAAM,aAAa;AAEZ,MAAM,mBAAmB,CAAC,QAA4B;AAC3D,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,IAAI,SAAS,MAAM;AACrB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,IAAI,KAAK;AACX,WAAO,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI;AAAA,EACvC;AACA,SAAO,GAAG,IAAI,QAAQ,IAAI;AAC5B;AAEO,MAAM,kBAAkB,CAAC,QAAwC;AACtE,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,MAAM,GAAG,UAAU,GAAG,GAAG;AAC3B,WAAO,EAAE,MAAM,MAAM,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI,MAAM,KAAK,OAAO,GAAG,GAAG;AAC1B,WAAO,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,EACnC;AAEA,SAAO,oBAAoB,GAAG;AAChC;AAEA,MAAM,sBAAsB,CAAC,QAA4C;AACvE,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,UAAM,CAAC,KAAK,WAAW,IAAI,IAAI,MAAM,GAAG;AACxC,QAAI,CAAC,OAAO,CAAC,aAAa;AACxB;AAAA,IACF;AACA,QAAI,CAAC,cAAc,GAAG,GAAG;AACvB;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,WAAW;AAC9C,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AAEA,MAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AACtB,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAW;AAAA,EACxD;AAEA,QAAM,CAAC,MAAM,OAAO,IAAI,IAAI,MAAM,GAAG;AACrC,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAY,aAAa,UAAU,cAAAA,QAAO,MAAM,OAAO;AAC9E,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,eAAe;AACvD;",
4
+ "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport semver from 'semver'\nimport * as utils from './utils'\n\ntype PackageType = sdk.Package['type']\nconst packageTypes: Record<PackageType, null> = {\n integration: null,\n interface: null,\n plugin: null,\n}\nconst isPackageType = (type: string): type is PackageType => type in packageTypes\n\nexport type UUIDPackageRef = {\n type: 'id'\n id: string\n}\n\nexport type NamePackageRef = {\n type: 'name'\n pkg?: PackageType\n name: string\n version: string\n}\n\nexport type LocalPackageRef = {\n type: 'path'\n path: string\n}\n\nexport type ApiPackageRef = UUIDPackageRef | NamePackageRef\nexport type PackageRef = ApiPackageRef | LocalPackageRef\n\nconst LATEST_TAG = 'latest'\n\nexport const formatPackageRef = (ref: PackageRef): string => {\n if (ref.type === 'path') {\n return ref.path\n }\n if (ref.type === 'id') {\n return ref.id\n }\n if (ref.pkg) {\n return `${ref.pkg}:${ref.name}@${ref.version}`\n }\n return `${ref.name}@${ref.version}`\n}\n\nexport const parsePackageRef = (ref: string): PackageRef | undefined => {\n if (!ref) {\n return\n }\n\n if (utils.id.isValidID(ref)) {\n return { type: 'id', id: ref }\n }\n\n if (utils.path.isPath(ref)) {\n return { type: 'path', path: ref }\n }\n\n return parseNamePackageRef(ref)\n}\n\nconst parseNamePackageRef = (ref: string): NamePackageRef | undefined => {\n if (!ref) {\n return\n }\n\n if (ref.includes(':')) {\n const [pkg, nameVersion] = ref.split(':')\n if (!pkg || !nameVersion) {\n return\n }\n if (!isPackageType(pkg)) {\n return\n }\n const parsed = parseNamePackageRef(nameVersion)\n if (!parsed) {\n return\n }\n return { ...parsed, pkg }\n }\n\n if (!ref.includes('@')) {\n return { type: 'name', name: ref, version: LATEST_TAG }\n }\n\n const [name, version] = ref.split('@')\n if (!name || !version) {\n return\n }\n\n const cleanedVersion = version === LATEST_TAG ? version : semver.validRange(version)\n if (!cleanedVersion) {\n return\n }\n\n return { type: 'name', name, version: cleanedVersion }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmB;AACnB,YAAuB;AAGvB,MAAM,eAA0C;AAAA,EAC9C,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AACV;AACA,MAAM,gBAAgB,CAAC,SAAsC,QAAQ;AAsBrE,MAAM,aAAa;AAEZ,MAAM,mBAAmB,CAAC,QAA4B;AAC3D,MAAI,IAAI,SAAS,QAAQ;AACvB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,IAAI,SAAS,MAAM;AACrB,WAAO,IAAI;AAAA,EACb;AACA,MAAI,IAAI,KAAK;AACX,WAAO,GAAG,IAAI,OAAO,IAAI,QAAQ,IAAI;AAAA,EACvC;AACA,SAAO,GAAG,IAAI,QAAQ,IAAI;AAC5B;AAEO,MAAM,kBAAkB,CAAC,QAAwC;AACtE,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,MAAM,GAAG,UAAU,GAAG,GAAG;AAC3B,WAAO,EAAE,MAAM,MAAM,IAAI,IAAI;AAAA,EAC/B;AAEA,MAAI,MAAM,KAAK,OAAO,GAAG,GAAG;AAC1B,WAAO,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,EACnC;AAEA,SAAO,oBAAoB,GAAG;AAChC;AAEA,MAAM,sBAAsB,CAAC,QAA4C;AACvE,MAAI,CAAC,KAAK;AACR;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,GAAG,GAAG;AACrB,UAAM,CAAC,KAAK,WAAW,IAAI,IAAI,MAAM,GAAG;AACxC,QAAI,CAAC,OAAO,CAAC,aAAa;AACxB;AAAA,IACF;AACA,QAAI,CAAC,cAAc,GAAG,GAAG;AACvB;AAAA,IACF;AACA,UAAM,SAAS,oBAAoB,WAAW;AAC9C,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,WAAO,EAAE,GAAG,QAAQ,IAAI;AAAA,EAC1B;AAEA,MAAI,CAAC,IAAI,SAAS,GAAG,GAAG;AACtB,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,SAAS,WAAW;AAAA,EACxD;AAEA,QAAM,CAAC,MAAM,OAAO,IAAI,IAAI,MAAM,GAAG;AACrC,MAAI,CAAC,QAAQ,CAAC,SAAS;AACrB;AAAA,EACF;AAEA,QAAM,iBAAiB,YAAY,aAAa,UAAU,cAAAA,QAAO,WAAW,OAAO;AACnF,MAAI,CAAC,gBAAgB;AACnB;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,eAAe;AACvD;",
6
6
  "names": ["semver"]
7
7
  }
@@ -13,8 +13,8 @@ const name = "myintegration";
13
13
  });
14
14
  (0, import_vitest.test)("parse with invalid version should return undefined", () => {
15
15
  const ref0 = `${name}@lol`;
16
- const ref1 = `${name}@1`;
17
- const ref2 = `${name}@1.0`;
16
+ const ref1 = `${name}@>>1`;
17
+ const ref2 = `${name}@1.0.b`;
18
18
  const result0 = (0, import_package_ref.parsePackageRef)(ref0);
19
19
  const result1 = (0, import_package_ref.parsePackageRef)(ref1);
20
20
  const result2 = (0, import_package_ref.parsePackageRef)(ref2);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/package-ref.test.ts"],
4
- "sourcesContent": ["import { test, expect, describe } from 'vitest'\nimport { formatPackageRef, PackageRef, parsePackageRef } from './package-ref'\n\nconst path = '/my/path'\nconst prefixedUlid = 'intver_01HF58RDKE3M7K5RJ5XZ7GF6HE'\nconst uuid = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'\nconst name = 'myintegration'\n\ndescribe('parsePackageRef', () => {\n test('parse empty string should return undefined', () => {\n // arrange\n const ref = ''\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n\n test('parse with invalid version should return undefined', () => {\n // arrange\n const ref0 = `${name}@lol`\n const ref1 = `${name}@1`\n const ref2 = `${name}@1.0`\n // act\n const result0 = parsePackageRef(ref0)\n const result1 = parsePackageRef(ref1)\n const result2 = parsePackageRef(ref2)\n // assert\n expect(result0).toBeUndefined()\n expect(result1).toBeUndefined()\n expect(result2).toBeUndefined()\n })\n\n test('parse with an absolute path should return path', () => {\n // arrange\n const ref = path\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'path', path: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a prefixed ULID sets `id` type', () => {\n // arrange\n const ref = prefixedUlid\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'id', id: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a legacy UUID sets `id` type', () => {\n // arrange\n const ref = uuid\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'id', id: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a name and version should return name and version', () => {\n // arrange\n const version = '1.0.0'\n const ref = `${name}@${version}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version }\n expect(result).toEqual(expected)\n })\n\n test('parse with a name and latest should return name and latest', () => {\n // arrange\n const version = 'latest'\n const ref = `${name}@${version}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version }\n expect(result).toEqual(expected)\n })\n\n test('parse with only a name should return name and latest', () => {\n // arrange\n const ref = name\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: 'latest' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type and a name should return the pkg, name and latest', () => {\n // arrange\n const ref = `integration:${name}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: 'latest', pkg: 'integration' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type, a name and a version should return all', () => {\n // arrange\n const ref = `integration:${name}@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: '1.0.0', pkg: 'integration' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type and a version should return undefined', () => {\n // arrange\n const ref = `plugin:@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n\n test('parse with an invalid package type should return undefined', () => {\n // arrange\n const ref = `bot:${name}@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n})\n\ndescribe('formatPackageRef', () => {\n test('format with a path should return path', () => {\n // arrange\n const ref: PackageRef = { type: 'path', path }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.path)\n })\n\n test('format with a prefixed ULID uses `id` type', () => {\n // arrange\n const ref: PackageRef = { type: 'id', id: prefixedUlid }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.id)\n })\n\n test('format with a legacy UUID uses `id` type', () => {\n // arrange\n const ref: PackageRef = { type: 'id', id: uuid }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.id)\n })\n\n test('format with a name and version should return name and version', () => {\n // arrange\n const version = '1.0.0'\n const ref: PackageRef = { type: 'name', name, version }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(`${name}@${version}`)\n })\n})\n"],
4
+ "sourcesContent": ["import { test, expect, describe } from 'vitest'\nimport { formatPackageRef, PackageRef, parsePackageRef } from './package-ref'\n\nconst path = '/my/path'\nconst prefixedUlid = 'intver_01HF58RDKE3M7K5RJ5XZ7GF6HE'\nconst uuid = 'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'\nconst name = 'myintegration'\n\ndescribe('parsePackageRef', () => {\n test('parse empty string should return undefined', () => {\n // arrange\n const ref = ''\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n\n test('parse with invalid version should return undefined', () => {\n // arrange\n const ref0 = `${name}@lol`\n const ref1 = `${name}@>>1`\n const ref2 = `${name}@1.0.b`\n // act\n const result0 = parsePackageRef(ref0)\n const result1 = parsePackageRef(ref1)\n const result2 = parsePackageRef(ref2)\n // assert\n expect(result0).toBeUndefined()\n expect(result1).toBeUndefined()\n expect(result2).toBeUndefined()\n })\n\n test('parse with an absolute path should return path', () => {\n // arrange\n const ref = path\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'path', path: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a prefixed ULID sets `id` type', () => {\n // arrange\n const ref = prefixedUlid\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'id', id: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a legacy UUID sets `id` type', () => {\n // arrange\n const ref = uuid\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'id', id: ref }\n expect(result).toEqual(expected)\n })\n\n test('parse with a name and version should return name and version', () => {\n // arrange\n const version = '1.0.0'\n const ref = `${name}@${version}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version }\n expect(result).toEqual(expected)\n })\n\n test('parse with a name and latest should return name and latest', () => {\n // arrange\n const version = 'latest'\n const ref = `${name}@${version}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version }\n expect(result).toEqual(expected)\n })\n\n test('parse with only a name should return name and latest', () => {\n // arrange\n const ref = name\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: 'latest' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type and a name should return the pkg, name and latest', () => {\n // arrange\n const ref = `integration:${name}`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: 'latest', pkg: 'integration' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type, a name and a version should return all', () => {\n // arrange\n const ref = `integration:${name}@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n const expected: PackageRef = { type: 'name', name, version: '1.0.0', pkg: 'integration' }\n expect(result).toEqual(expected)\n })\n\n test('parse with a package type and a version should return undefined', () => {\n // arrange\n const ref = `plugin:@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n\n test('parse with an invalid package type should return undefined', () => {\n // arrange\n const ref = `bot:${name}@1.0.0`\n // act\n const result = parsePackageRef(ref)\n // assert\n expect(result).toBeUndefined()\n })\n})\n\ndescribe('formatPackageRef', () => {\n test('format with a path should return path', () => {\n // arrange\n const ref: PackageRef = { type: 'path', path }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.path)\n })\n\n test('format with a prefixed ULID uses `id` type', () => {\n // arrange\n const ref: PackageRef = { type: 'id', id: prefixedUlid }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.id)\n })\n\n test('format with a legacy UUID uses `id` type', () => {\n // arrange\n const ref: PackageRef = { type: 'id', id: uuid }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(ref.id)\n })\n\n test('format with a name and version should return name and version', () => {\n // arrange\n const version = '1.0.0'\n const ref: PackageRef = { type: 'name', name, version }\n // act\n const result = formatPackageRef(ref)\n // assert\n expect(result).toEqual(`${name}@${version}`)\n })\n})\n"],
5
5
  "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -51,7 +51,12 @@ class TablesPublisher {
51
51
  const api = this._api.switchBot(botId);
52
52
  this._logger.log("Synchronizing tables...");
53
53
  const tablesFromBotDef = Object.entries(botDefinition.tables ?? {});
54
- const { tables: existingTables } = await api.client.listTables({});
54
+ const listTableResult = await api.safeListTables({});
55
+ if (!listTableResult.success) {
56
+ this._logger.warn("Tables API is not available, skipping table deployment.");
57
+ return;
58
+ }
59
+ const { tables: existingTables } = listTableResult;
55
60
  for (const [tableName, tableDef] of tablesFromBotDef) {
56
61
  const existingTable = existingTables.find((t) => t.name === tableName);
57
62
  this._logger.log(`Deploying table "${tableName}"...`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/tables/tables-publisher.ts"],
4
- "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport * as apiUtils from '../api'\nimport * as errors from '../errors'\nimport * as logger from '../logger'\nimport * as utils from '../utils'\nimport * as schemas from './schemas'\n\nexport class TablesPublisher {\n private readonly _api: apiUtils.ApiClient\n private readonly _logger: logger.Logger\n private readonly _prompt: utils.prompt.CLIPrompt\n\n public constructor({\n api,\n logger,\n prompt,\n }: {\n api: apiUtils.ApiClient\n logger: logger.Logger\n prompt: utils.prompt.CLIPrompt\n }) {\n this._api = api\n this._logger = logger\n this._prompt = prompt\n }\n\n public async deployTables({ botId, botDefinition }: { botId: string; botDefinition: sdk.BotDefinition }) {\n const api = this._api.switchBot(botId)\n\n this._logger.log('Synchronizing tables...')\n\n const tablesFromBotDef = Object.entries(botDefinition.tables ?? {})\n const { tables: existingTables } = await api.client.listTables({})\n\n for (const [tableName, tableDef] of tablesFromBotDef) {\n const existingTable = existingTables.find((t) => t.name === tableName)\n\n this._logger.log(`Deploying table \"${tableName}\"...`)\n\n if (existingTable) {\n await this._deployExistingTable({ api, existingTable, updatedTableDef: tableDef })\n } else {\n await this._deployNewTable({ api, tableName, tableDef })\n }\n }\n\n for (const existingTable of existingTables) {\n if (!tablesFromBotDef.find(([tableName]) => tableName === existingTable.name)) {\n this._logger.log(\n `Table \"${existingTable.name}\" was previously defined but is not present in your bot definition. ` +\n 'This table will be ignored. ' +\n 'If you wish to delete this table, you may do so from the studio.'\n )\n }\n }\n }\n\n private async _deployExistingTable({\n api,\n existingTable,\n updatedTableDef,\n }: {\n api: apiUtils.ApiClient\n existingTable: Awaited<ReturnType<apiUtils.ApiClient['client']['listTables']>>['tables'][number]\n updatedTableDef: sdk.BotTableDefinition\n }) {\n if (existingTable.frozen) {\n this._logger.warn(`Table \"${existingTable.name}\" is frozen and will not be updated.`)\n return\n }\n\n const existingColumns = existingTable.schema.properties\n const updatedColumns = await this._parseTableColumns({ tableName: existingTable.name, tableDef: updatedTableDef })\n\n for (const [columnName, existingColumn] of Object.entries(existingColumns)) {\n const updatedColumn = updatedColumns[columnName]\n\n if (!updatedColumn) {\n const wishToContinue = await this._warnAndConfirm(\n `Column \"${columnName}\" is missing from the schema of table \"${existingTable.name}\" in your bot definition. ` +\n 'If you are attempting to rename this column, please do so from the studio. ' +\n 'Renaming a column in your bot definition will cause a new column to be created. ' +\n 'If this is not a rename and you wish to proceed, the old column will be kept unchanged. ' +\n 'You can delete columns from the studio if you no longer need them.'\n )\n\n // TODO: ask the user whether this is a rename. If it is a rename, list\n // all other columns and ask which one has the new name, then do\n // the rename operation with client.renameTableColumn()\n\n if (!wishToContinue) {\n return\n }\n }\n\n if (updatedColumn && existingColumn.type !== updatedColumn.type) {\n const wishToContinue = await this._warnAndConfirm(\n 'DATA LOSS WARNING: ' +\n `Type of column \"${columnName}\" has changed from \"${existingColumn.type}\" to \"${updatedColumn.type}\" in table \"${existingTable.name}\". ` +\n 'If you proceed, the value of this column will be reset to NULL for all rows in the table.'\n )\n\n if (!wishToContinue) {\n return\n }\n }\n }\n\n await api.client.updateTable({\n table: existingTable.name,\n schema: sdk.transforms.toJSONSchemaLegacy(updatedTableDef.schema),\n frozen: updatedTableDef.frozen,\n tags: updatedTableDef.tags,\n isComputeEnabled: updatedTableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${existingTable.name}\" has been updated`)\n }\n\n private async _parseTableColumns({\n tableName,\n tableDef,\n }: {\n tableName: string\n tableDef: sdk.BotTableDefinition\n }): Promise<Record<string, sdk.z.infer<typeof schemas.columnSchema>>> {\n const columns = sdk.transforms.toJSONSchemaLegacy(tableDef.schema).properties!\n\n const validColumns = await Promise.all(\n Object.entries(columns).map(async ([columnName, columnSchema]) => {\n const validatedSchema = await schemas.columnSchema.safeParseAsync(columnSchema)\n\n if (!validatedSchema.success) {\n throw new errors.BotpressCLIError(\n `Column \"${columnName}\" in table \"${tableName}\" has an invalid schema: ${validatedSchema.error.message}`\n )\n }\n\n return [columnName, validatedSchema.data] as const\n })\n )\n\n return Object.fromEntries(validColumns)\n }\n\n private async _warnAndConfirm(warningMessage: string, confirmMessage: string = 'Are you sure you want to continue?') {\n this._logger.warn(warningMessage)\n\n const confirm = await this._prompt.confirm(confirmMessage)\n\n if (!confirm) {\n this._logger.log('Aborted')\n return false\n }\n return true\n }\n\n private async _deployNewTable({\n api,\n tableName,\n tableDef,\n }: {\n api: apiUtils.ApiClient\n tableName: string\n tableDef: sdk.BotTableDefinition\n }) {\n await api.client.createTable({\n name: tableName,\n schema: sdk.transforms.toJSONSchemaLegacy(tableDef.schema),\n frozen: tableDef.frozen,\n tags: tableDef.tags,\n factor: tableDef.factor,\n isComputeEnabled: tableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${tableName}\" has been created`)\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport * as apiUtils from '../api'\nimport * as errors from '../errors'\nimport * as logger from '../logger'\nimport * as utils from '../utils'\nimport * as schemas from './schemas'\n\nexport class TablesPublisher {\n private readonly _api: apiUtils.ApiClient\n private readonly _logger: logger.Logger\n private readonly _prompt: utils.prompt.CLIPrompt\n\n public constructor({\n api,\n logger,\n prompt,\n }: {\n api: apiUtils.ApiClient\n logger: logger.Logger\n prompt: utils.prompt.CLIPrompt\n }) {\n this._api = api\n this._logger = logger\n this._prompt = prompt\n }\n\n public async deployTables({ botId, botDefinition }: { botId: string; botDefinition: sdk.BotDefinition }) {\n const api = this._api.switchBot(botId)\n\n this._logger.log('Synchronizing tables...')\n\n const tablesFromBotDef = Object.entries(botDefinition.tables ?? {})\n const listTableResult = await api.safeListTables({})\n\n if (!listTableResult.success) {\n this._logger.warn('Tables API is not available, skipping table deployment.')\n return\n }\n\n const { tables: existingTables } = listTableResult\n for (const [tableName, tableDef] of tablesFromBotDef) {\n const existingTable = existingTables.find((t) => t.name === tableName)\n\n this._logger.log(`Deploying table \"${tableName}\"...`)\n\n if (existingTable) {\n await this._deployExistingTable({ api, existingTable, updatedTableDef: tableDef })\n } else {\n await this._deployNewTable({ api, tableName, tableDef })\n }\n }\n\n for (const existingTable of existingTables) {\n if (!tablesFromBotDef.find(([tableName]) => tableName === existingTable.name)) {\n this._logger.log(\n `Table \"${existingTable.name}\" was previously defined but is not present in your bot definition. ` +\n 'This table will be ignored. ' +\n 'If you wish to delete this table, you may do so from the studio.'\n )\n }\n }\n }\n\n private async _deployExistingTable({\n api,\n existingTable,\n updatedTableDef,\n }: {\n api: apiUtils.ApiClient\n existingTable: Awaited<ReturnType<apiUtils.ApiClient['client']['listTables']>>['tables'][number]\n updatedTableDef: sdk.BotTableDefinition\n }) {\n if (existingTable.frozen) {\n this._logger.warn(`Table \"${existingTable.name}\" is frozen and will not be updated.`)\n return\n }\n\n const existingColumns = existingTable.schema.properties\n const updatedColumns = await this._parseTableColumns({ tableName: existingTable.name, tableDef: updatedTableDef })\n\n for (const [columnName, existingColumn] of Object.entries(existingColumns)) {\n const updatedColumn = updatedColumns[columnName]\n\n if (!updatedColumn) {\n const wishToContinue = await this._warnAndConfirm(\n `Column \"${columnName}\" is missing from the schema of table \"${existingTable.name}\" in your bot definition. ` +\n 'If you are attempting to rename this column, please do so from the studio. ' +\n 'Renaming a column in your bot definition will cause a new column to be created. ' +\n 'If this is not a rename and you wish to proceed, the old column will be kept unchanged. ' +\n 'You can delete columns from the studio if you no longer need them.'\n )\n\n // TODO: ask the user whether this is a rename. If it is a rename, list\n // all other columns and ask which one has the new name, then do\n // the rename operation with client.renameTableColumn()\n\n if (!wishToContinue) {\n return\n }\n }\n\n if (updatedColumn && existingColumn.type !== updatedColumn.type) {\n const wishToContinue = await this._warnAndConfirm(\n 'DATA LOSS WARNING: ' +\n `Type of column \"${columnName}\" has changed from \"${existingColumn.type}\" to \"${updatedColumn.type}\" in table \"${existingTable.name}\". ` +\n 'If you proceed, the value of this column will be reset to NULL for all rows in the table.'\n )\n\n if (!wishToContinue) {\n return\n }\n }\n }\n\n await api.client.updateTable({\n table: existingTable.name,\n schema: sdk.transforms.toJSONSchemaLegacy(updatedTableDef.schema),\n frozen: updatedTableDef.frozen,\n tags: updatedTableDef.tags,\n isComputeEnabled: updatedTableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${existingTable.name}\" has been updated`)\n }\n\n private async _parseTableColumns({\n tableName,\n tableDef,\n }: {\n tableName: string\n tableDef: sdk.BotTableDefinition\n }): Promise<Record<string, sdk.z.infer<typeof schemas.columnSchema>>> {\n const columns = sdk.transforms.toJSONSchemaLegacy(tableDef.schema).properties!\n\n const validColumns = await Promise.all(\n Object.entries(columns).map(async ([columnName, columnSchema]) => {\n const validatedSchema = await schemas.columnSchema.safeParseAsync(columnSchema)\n\n if (!validatedSchema.success) {\n throw new errors.BotpressCLIError(\n `Column \"${columnName}\" in table \"${tableName}\" has an invalid schema: ${validatedSchema.error.message}`\n )\n }\n\n return [columnName, validatedSchema.data] as const\n })\n )\n\n return Object.fromEntries(validColumns)\n }\n\n private async _warnAndConfirm(warningMessage: string, confirmMessage: string = 'Are you sure you want to continue?') {\n this._logger.warn(warningMessage)\n\n const confirm = await this._prompt.confirm(confirmMessage)\n\n if (!confirm) {\n this._logger.log('Aborted')\n return false\n }\n return true\n }\n\n private async _deployNewTable({\n api,\n tableName,\n tableDef,\n }: {\n api: apiUtils.ApiClient\n tableName: string\n tableDef: sdk.BotTableDefinition\n }) {\n await api.client.createTable({\n name: tableName,\n schema: sdk.transforms.toJSONSchemaLegacy(tableDef.schema),\n frozen: tableDef.frozen,\n tags: tableDef.tags,\n factor: tableDef.factor,\n isComputeEnabled: tableDef.isComputeEnabled,\n })\n\n this._logger.success(`Table \"${tableName}\" has been created`)\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["logger"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "4.14.6",
3
+ "version": "4.15.1",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",
@@ -1,66 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
- // If the importer is in node compatibility mode or this is not an ESM
22
- // file that has been converted to a CommonJS file using a Babel-
23
- // compatible transform (i.e. "__esModule" has not been set), then set
24
- // "default" to the CommonJS "module.exports" for node compatibility.
25
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
- mod
27
- ));
28
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
- var find_previous_version_exports = {};
30
- __export(find_previous_version_exports, {
31
- findPreviousIntegrationVersion: () => findPreviousIntegrationVersion
32
- });
33
- module.exports = __toCommonJS(find_previous_version_exports);
34
- var import_semver = __toESM(require("semver"));
35
- var paging = __toESM(require("./paging"));
36
- const findPreviousIntegrationVersion = async (client2, ref) => {
37
- const { name, version: targetVersion } = ref;
38
- const allVersions = await paging.listAllPages(
39
- async ({ nextToken }) => client2.listIntegrations({ name, nextToken }),
40
- (r) => r.integrations
41
- );
42
- const orderedVersions = allVersions.sort((a, b) => import_semver.default.compare(b.version, a.version));
43
- const latestVersion = orderedVersions[0];
44
- if (!latestVersion) {
45
- return;
46
- }
47
- let current = [0, latestVersion];
48
- while (import_semver.default.gte(current[1].version, targetVersion)) {
49
- const nextIdx = current[0] + 1;
50
- const nextIntegration = orderedVersions[nextIdx];
51
- if (!nextIntegration) {
52
- break;
53
- }
54
- current = [nextIdx, nextIntegration];
55
- }
56
- const previous = current[1];
57
- if (import_semver.default.gte(previous.version, targetVersion)) {
58
- return;
59
- }
60
- return previous;
61
- };
62
- // Annotate the CommonJS export names for ESM import in node:
63
- 0 && (module.exports = {
64
- findPreviousIntegrationVersion
65
- });
66
- //# sourceMappingURL=find-previous-version.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/api/find-previous-version.ts"],
4
- "sourcesContent": ["import * as client from '@botpress/client'\nimport semver from 'semver'\nimport { NamePackageRef } from '../package-ref'\nimport * as paging from './paging'\nimport { IntegrationSummary } from './types'\n\nexport const findPreviousIntegrationVersion = async (\n client: client.Client,\n ref: NamePackageRef\n): Promise<IntegrationSummary | undefined> => {\n const { name, version: targetVersion } = ref\n const allVersions = await paging.listAllPages(\n async ({ nextToken }) => client.listIntegrations({ name, nextToken }),\n (r) => r.integrations\n )\n\n const orderedVersions = allVersions.sort((a, b) => semver.compare(b.version, a.version))\n const latestVersion = orderedVersions[0]\n if (!latestVersion) {\n return\n }\n\n type VersionIdx = [number, IntegrationSummary]\n\n let current: VersionIdx = [0, latestVersion]\n while (semver.gte(current[1].version, targetVersion)) {\n const nextIdx = current[0] + 1\n const nextIntegration = orderedVersions[nextIdx]\n if (!nextIntegration) {\n break\n }\n current = [nextIdx, nextIntegration]\n }\n\n const previous = current[1]\n if (semver.gte(previous.version, targetVersion)) {\n return\n }\n\n return previous\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,oBAAmB;AAEnB,aAAwB;AAGjB,MAAM,iCAAiC,OAC5CA,SACA,QAC4C;AAC5C,QAAM,EAAE,MAAM,SAAS,cAAc,IAAI;AACzC,QAAM,cAAc,MAAM,OAAO;AAAA,IAC/B,OAAO,EAAE,UAAU,MAAMA,QAAO,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAAA,IACpE,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,kBAAkB,YAAY,KAAK,CAAC,GAAG,MAAM,cAAAC,QAAO,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;AACvF,QAAM,gBAAgB,gBAAgB,CAAC;AACvC,MAAI,CAAC,eAAe;AAClB;AAAA,EACF;AAIA,MAAI,UAAsB,CAAC,GAAG,aAAa;AAC3C,SAAO,cAAAA,QAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,aAAa,GAAG;AACpD,UAAM,UAAU,QAAQ,CAAC,IAAI;AAC7B,UAAM,kBAAkB,gBAAgB,OAAO;AAC/C,QAAI,CAAC,iBAAiB;AACpB;AAAA,IACF;AACA,cAAU,CAAC,SAAS,eAAe;AAAA,EACrC;AAEA,QAAM,WAAW,QAAQ,CAAC;AAC1B,MAAI,cAAAA,QAAO,IAAI,SAAS,SAAS,aAAa,GAAG;AAC/C;AAAA,EACF;AAEA,SAAO;AACT;",
6
- "names": ["client", "semver"]
7
- }
@@ -1,77 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __copyProps = (to, from, except, desc) => {
9
- if (from && typeof from === "object" || typeof from === "function") {
10
- for (let key of __getOwnPropNames(from))
11
- if (!__hasOwnProp.call(to, key) && key !== except)
12
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
- }
14
- return to;
15
- };
16
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
- // If the importer is in node compatibility mode or this is not an ESM
18
- // file that has been converted to a CommonJS file using a Babel-
19
- // compatible transform (i.e. "__esModule" has not been set), then set
20
- // "default" to the CommonJS "module.exports" for node compatibility.
21
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
- mod
23
- ));
24
- var uuid = __toESM(require("uuid"));
25
- var import_vitest = require("vitest");
26
- var import_find_previous_version = require("./find-previous-version");
27
- class IntegrationFixtureCreator {
28
- constructor(name) {
29
- this.name = name;
30
- }
31
- t0 = Date.now();
32
- create = (version) => {
33
- return {
34
- id: uuid.v4(),
35
- name: this.name,
36
- version,
37
- public: true,
38
- visibility: "public",
39
- createdAt: new Date(this.t0++).toISOString(),
40
- updatedAt: new Date(this.t0++).toISOString(),
41
- description: "description",
42
- title: "title",
43
- iconUrl: "iconUrl",
44
- verificationStatus: "approved"
45
- };
46
- };
47
- }
48
- (0, import_vitest.test)("find previous integration version", async () => {
49
- const client2 = {
50
- listIntegrations: async ({ name }) => {
51
- const creator = new IntegrationFixtureCreator(name);
52
- const integrations = [
53
- creator.create("9.2.0"),
54
- creator.create("9.2.1"),
55
- creator.create("9.3.0"),
56
- creator.create("9.2.2"),
57
- creator.create("10.0.0")
58
- ].reverse();
59
- return { integrations, meta: {} };
60
- }
61
- };
62
- const getPrevious = async (version) => {
63
- const integration = await (0, import_find_previous_version.findPreviousIntegrationVersion)(client2, {
64
- type: "name",
65
- name: "slack",
66
- version
67
- });
68
- return integration?.version;
69
- };
70
- (0, import_vitest.expect)(await getPrevious("10.0.1")).toEqual("10.0.0");
71
- (0, import_vitest.expect)(await getPrevious("10.0.0")).toEqual("9.3.0");
72
- (0, import_vitest.expect)(await getPrevious("9.3.0")).toEqual("9.2.2");
73
- (0, import_vitest.expect)(await getPrevious("9.2.2")).toEqual("9.2.1");
74
- (0, import_vitest.expect)(await getPrevious("9.2.1")).toEqual("9.2.0");
75
- (0, import_vitest.expect)(await getPrevious("9.2.0")).toEqual(void 0);
76
- });
77
- //# sourceMappingURL=find-previous-version.test.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/api/find-previous-version.test.ts"],
4
- "sourcesContent": ["import * as uuid from 'uuid'\nimport * as client from '@botpress/client'\nimport { test, expect } from 'vitest'\nimport { findPreviousIntegrationVersion } from './find-previous-version'\nimport { IntegrationSummary } from './types'\n\nclass IntegrationFixtureCreator {\n private t0 = Date.now()\n\n public constructor(private name: string) {}\n\n public create = (version: string): IntegrationSummary => {\n return {\n id: uuid.v4(),\n name: this.name,\n version,\n public: true,\n visibility: 'public',\n createdAt: new Date(this.t0++).toISOString(),\n updatedAt: new Date(this.t0++).toISOString(),\n description: 'description',\n title: 'title',\n iconUrl: 'iconUrl',\n verificationStatus: 'approved',\n }\n }\n}\n\ntest('find previous integration version', async () => {\n const client: Partial<client.Client> = {\n listIntegrations: async ({ name }: { name?: string; version?: string }) => {\n const creator = new IntegrationFixtureCreator(name!)\n\n const integrations: IntegrationSummary[] = [\n creator.create('9.2.0'),\n creator.create('9.2.1'),\n creator.create('9.3.0'),\n creator.create('9.2.2'),\n creator.create('10.0.0'),\n ].reverse() // reverse creation order just like the real API\n\n return { integrations, meta: {} }\n },\n }\n\n const getPrevious = async (version: string) => {\n const integration = await findPreviousIntegrationVersion(client as client.Client, {\n type: 'name',\n name: 'slack',\n version,\n })\n return integration?.version\n }\n\n expect(await getPrevious('10.0.1')).toEqual('10.0.0')\n expect(await getPrevious('10.0.0')).toEqual('9.3.0')\n expect(await getPrevious('9.3.0')).toEqual('9.2.2')\n expect(await getPrevious('9.2.2')).toEqual('9.2.1')\n expect(await getPrevious('9.2.1')).toEqual('9.2.0')\n expect(await getPrevious('9.2.0')).toEqual(undefined)\n})\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;AAAA,WAAsB;AAEtB,oBAA6B;AAC7B,mCAA+C;AAG/C,MAAM,0BAA0B;AAAA,EAGvB,YAAoB,MAAc;AAAd;AAAA,EAAe;AAAA,EAFlC,KAAK,KAAK,IAAI;AAAA,EAIf,SAAS,CAAC,YAAwC;AACvD,WAAO;AAAA,MACL,IAAI,KAAK,GAAG;AAAA,MACZ,MAAM,KAAK;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,YAAY;AAAA,MAC3C,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE,YAAY;AAAA,MAC3C,aAAa;AAAA,MACb,OAAO;AAAA,MACP,SAAS;AAAA,MACT,oBAAoB;AAAA,IACtB;AAAA,EACF;AACF;AAAA,IAEA,oBAAK,qCAAqC,YAAY;AACpD,QAAMA,UAAiC;AAAA,IACrC,kBAAkB,OAAO,EAAE,KAAK,MAA2C;AACzE,YAAM,UAAU,IAAI,0BAA0B,IAAK;AAEnD,YAAM,eAAqC;AAAA,QACzC,QAAQ,OAAO,OAAO;AAAA,QACtB,QAAQ,OAAO,OAAO;AAAA,QACtB,QAAQ,OAAO,OAAO;AAAA,QACtB,QAAQ,OAAO,OAAO;AAAA,QACtB,QAAQ,OAAO,QAAQ;AAAA,MACzB,EAAE,QAAQ;AAEV,aAAO,EAAE,cAAc,MAAM,CAAC,EAAE;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,YAAoB;AAC7C,UAAM,cAAc,UAAM,6DAA+BA,SAAyB;AAAA,MAChF,MAAM;AAAA,MACN,MAAM;AAAA,MACN;AAAA,IACF,CAAC;AACD,WAAO,aAAa;AAAA,EACtB;AAEA,4BAAO,MAAM,YAAY,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AACpD,4BAAO,MAAM,YAAY,QAAQ,CAAC,EAAE,QAAQ,OAAO;AACnD,4BAAO,MAAM,YAAY,OAAO,CAAC,EAAE,QAAQ,OAAO;AAClD,4BAAO,MAAM,YAAY,OAAO,CAAC,EAAE,QAAQ,OAAO;AAClD,4BAAO,MAAM,YAAY,OAAO,CAAC,EAAE,QAAQ,OAAO;AAClD,4BAAO,MAAM,YAAY,OAAO,CAAC,EAAE,QAAQ,MAAS;AACtD,CAAC;",
6
- "names": ["client"]
7
- }