@botpress/cli 4.17.2 → 4.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,32 +1,32 @@
1
1
 
2
- > @botpress/cli@4.17.2 build /home/runner/work/botpress/botpress/packages/cli
2
+ > @botpress/cli@4.17.3 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.17.2 bundle /home/runner/work/botpress/botpress/packages/cli
6
+ > @botpress/cli@4.17.3 bundle /home/runner/work/botpress/botpress/packages/cli
7
7
  > ts-node -T build.ts
8
8
 
9
9
 
10
- > @botpress/cli@4.17.2 template:gen /home/runner/work/botpress/botpress/packages/cli
10
+ > @botpress/cli@4.17.3 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.17.2
14
- 🤖 Botpress CLI v4.17.2
15
- 🤖 Botpress CLI v4.17.2
16
- 🤖 Botpress CLI v4.17.2
17
- ○ Generating typings for bot...
18
- ○ Generating typings for integration empty-integration...
13
+ 🤖 Botpress CLI v4.17.3
14
+ 🤖 Botpress CLI v4.17.3
15
+ 🤖 Botpress CLI v4.17.3
16
+ 🤖 Botpress CLI v4.17.3
17
+ ○ Generating typings for integration hello-world...
19
18
  ✓ Typings available at .botpress
20
19
 
20
+ ○ Generating typings for integration empty-integration...
21
21
  ✓ Typings available at .botpress
22
22
 
23
+ ○ Generating typings for bot...
23
24
  ○ Generating typings for plugin empty-plugin...
24
25
  ✓ Typings available at .botpress
25
26
 
26
- ○ Generating typings for integration hello-world...
27
27
  ✓ Typings available at .botpress
28
28
 
29
- 🤖 Botpress CLI v4.17.2
29
+ 🤖 Botpress CLI v4.17.3
30
30
  ○ Generating typings for integration webhook-message...
31
31
  ✓ Typings available at .botpress
32
32
 
@@ -51,7 +51,8 @@ const MESSAGE_ICONS = {
51
51
  location: "\u{1F4CD}",
52
52
  text: "",
53
53
  video: "\u{1F3A5}",
54
- markdown: ""
54
+ markdown: "",
55
+ bloc: "\u{1F9F1}"
55
56
  };
56
57
  const EXIT_KEYWORDS = ["exit", ".exit"];
57
58
  class Chat {
@@ -189,6 +190,11 @@ class Chat {
189
190
  return prefix + message.payload.videoUrl;
190
191
  case "markdown":
191
192
  return prefix + message.payload.markdown;
193
+ case "bloc":
194
+ return [
195
+ prefix,
196
+ ...message.payload.items.map((item) => this._messageToText({ payload: item })).map((l) => ` ${l}`)
197
+ ].join("\n");
192
198
  default:
193
199
  return "<unknown>";
194
200
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/chat/index.ts"],
4
- "sourcesContent": ["import * as chat from '@botpress/chat'\nimport * as chalk from 'chalk'\nimport * as readline from 'readline'\nimport * as uuid from 'uuid'\nimport * as utils from '../utils'\n\ntype MessageSource = 'myself' | 'bot' | 'other'\ntype ChatMessage = chat.Message & { source: MessageSource }\ntype ChatState =\n | {\n status: 'stopped'\n }\n | {\n status: 'running'\n messages: ChatMessage[]\n connection: chat.SignalListener\n keyboard: readline.Interface\n }\n\nconst USER_ICONS: Record<MessageSource, string> = {\n myself: '\uD83D\uDC64',\n bot: '\uD83E\uDD16',\n other: '\uD83D\uDC65',\n}\n\nconst MESSAGE_ICONS: Record<chat.Message['payload']['type'], string> = {\n audio: '\uD83C\uDFB5',\n card: '\uD83C\uDCCF',\n carousel: '\uD83C\uDFA0',\n choice: '\uD83D\uDD3D',\n dropdown: '\uD83D\uDD3D',\n file: '\uD83D\uDCC1',\n image: '\uD83C\uDF05',\n location: '\uD83D\uDCCD',\n text: '',\n video: '\uD83C\uDFA5',\n markdown: '',\n}\n\nconst EXIT_KEYWORDS = ['exit', '.exit']\n\nexport type ChatProps = {\n client: chat.AuthenticatedClient\n conversationId: string\n}\n\nexport class Chat {\n private _events = new utils.emitter.EventEmitter<{ state: ChatState }>()\n private _state: ChatState = { status: 'stopped' }\n\n public static launch(props: ChatProps): Chat {\n const instance = new Chat(props)\n void instance._run()\n return instance\n }\n\n private constructor(private _props: ChatProps) {}\n\n private async _run() {\n this._switchAlternateScreenBuffer()\n this._events.on('state', this._renderMessages)\n\n const connection = await this._props.client.listenConversation({ id: this._props.conversationId })\n const keyboard = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n connection.on('message_created', (m) => void this._onMessageReceived(m))\n keyboard.on('line', (l) => void this._onKeyboardInput(l))\n process.stdin.on('keypress', (_, key) => {\n if (key.name === 'escape') {\n void this._onExit()\n }\n })\n\n this._setState({ status: 'running', messages: [], connection, keyboard })\n }\n\n private _setState = (newState: ChatState) => {\n this._state = newState\n this._events.emit('state', this._state)\n }\n\n private _onMessageReceived = async (message: chat.Signals['message_created']) => {\n if (this._state.status === 'stopped') {\n return\n }\n if (message.userId === this._props.client.user.id) {\n return\n }\n const source: MessageSource = message.isBot ? 'bot' : 'other'\n this._setState({ ...this._state, messages: [...this._state.messages, { ...message, source }] })\n }\n\n private _onKeyboardInput = async (line: string) => {\n if (this._state.status === 'stopped') {\n return\n }\n\n if (EXIT_KEYWORDS.includes(line)) {\n await this._onExit()\n return\n }\n\n if (!line) {\n this._setState({ ...this._state })\n return\n }\n\n const message = this._textToMessage(line)\n this._setState({ ...this._state, messages: [...this._state.messages, message] })\n await this._props.client.createMessage(message)\n }\n\n private _onExit = async () => {\n if (this._state.status === 'stopped') {\n return\n }\n const { connection, keyboard } = this._state\n await connection.disconnect()\n connection.cleanup()\n keyboard.close()\n this._setState({ status: 'stopped' })\n this._clearStdOut()\n this._restoreOriginalScreenBuffer()\n }\n\n public wait(): Promise<void> {\n return new Promise<void>((resolve) => {\n const cb = (state: ChatState) => {\n if (state.status === 'stopped') {\n this._events.off('state', cb)\n resolve()\n }\n }\n this._events.on('state', cb)\n })\n }\n\n private _renderMessages = () => {\n if (this._state.status === 'stopped') {\n return\n }\n\n this._clearStdOut()\n this._printHeader()\n\n for (const message of this._state.messages) {\n const prefix = USER_ICONS[message.source]\n const text = this._messageToText(message)\n const coloredText = message.source === 'bot' ? text : chalk.gray(text)\n process.stdout.write(`${prefix} ${coloredText}\\n`)\n }\n\n this._state.keyboard.setPrompt('>> ')\n this._state.keyboard.prompt(true) // Redisplay the prompt and maintain current input\n }\n\n private _printHeader = () => {\n process.stdout.write(chalk.bold('Botpress Chat\\n'))\n process.stdout.write(chalk.gray('Type \"exit\" or press ESC key to quit\\n'))\n }\n\n private _switchAlternateScreenBuffer = () => {\n process.stdout.write('\\x1B[?1049h')\n }\n\n private _restoreOriginalScreenBuffer = () => {\n process.stdout.write('\\x1B[?1049l')\n }\n\n private _clearStdOut = () => {\n process.stdout.write('\\x1B[2J\\x1B[0;0H')\n }\n\n private _messageToText = (message: chat.Message): string => {\n const prefix = MESSAGE_ICONS[message.payload.type]\n switch (message.payload.type) {\n case 'audio':\n return prefix + message.payload.audioUrl\n case 'card':\n return prefix + JSON.stringify(message.payload)\n case 'carousel':\n return prefix + JSON.stringify(message.payload)\n case 'choice':\n return (\n prefix +\n [message.payload.text, ...message.payload.options.map((o) => ` - ${o.label} (${o.value})`)].join('\\n')\n )\n case 'dropdown':\n return (\n prefix +\n [message.payload.text, ...message.payload.options.map((o) => ` - ${o.label} (${o.value})`)].join('\\n')\n )\n case 'file':\n return prefix + message.payload.fileUrl\n case 'image':\n return prefix + message.payload.imageUrl\n case 'location':\n return prefix + `${message.payload.latitude},${message.payload.longitude} (${message.payload.address})`\n case 'text':\n return prefix + message.payload.text\n case 'video':\n return prefix + message.payload.videoUrl\n case 'markdown':\n return prefix + message.payload.markdown\n default:\n type _assertion = utils.types.AssertNever<typeof message.payload>\n return '<unknown>'\n }\n }\n\n private _textToMessage = (text: string): ChatMessage => {\n return {\n id: uuid.v4(),\n userId: this._props.client.user.id,\n source: 'myself',\n conversationId: this._props.conversationId,\n createdAt: new Date().toISOString(),\n payload: { type: 'text', text },\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as chat from '@botpress/chat'\nimport * as chalk from 'chalk'\nimport * as readline from 'readline'\nimport * as uuid from 'uuid'\nimport * as utils from '../utils'\n\ntype MessageSource = 'myself' | 'bot' | 'other'\ntype ChatMessage = chat.Message & { source: MessageSource }\ntype ChatState =\n | {\n status: 'stopped'\n }\n | {\n status: 'running'\n messages: ChatMessage[]\n connection: chat.SignalListener\n keyboard: readline.Interface\n }\n\nconst USER_ICONS: Record<MessageSource, string> = {\n myself: '\uD83D\uDC64',\n bot: '\uD83E\uDD16',\n other: '\uD83D\uDC65',\n}\n\nconst MESSAGE_ICONS: Record<chat.Message['payload']['type'], string> = {\n audio: '\uD83C\uDFB5',\n card: '\uD83C\uDCCF',\n carousel: '\uD83C\uDFA0',\n choice: '\uD83D\uDD3D',\n dropdown: '\uD83D\uDD3D',\n file: '\uD83D\uDCC1',\n image: '\uD83C\uDF05',\n location: '\uD83D\uDCCD',\n text: '',\n video: '\uD83C\uDFA5',\n markdown: '',\n bloc: '\uD83E\uDDF1',\n}\n\nconst EXIT_KEYWORDS = ['exit', '.exit']\n\nexport type ChatProps = {\n client: chat.AuthenticatedClient\n conversationId: string\n}\n\nexport class Chat {\n private _events = new utils.emitter.EventEmitter<{ state: ChatState }>()\n private _state: ChatState = { status: 'stopped' }\n\n public static launch(props: ChatProps): Chat {\n const instance = new Chat(props)\n void instance._run()\n return instance\n }\n\n private constructor(private _props: ChatProps) {}\n\n private async _run() {\n this._switchAlternateScreenBuffer()\n this._events.on('state', this._renderMessages)\n\n const connection = await this._props.client.listenConversation({ id: this._props.conversationId })\n const keyboard = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n\n connection.on('message_created', (m) => void this._onMessageReceived(m))\n keyboard.on('line', (l) => void this._onKeyboardInput(l))\n process.stdin.on('keypress', (_, key) => {\n if (key.name === 'escape') {\n void this._onExit()\n }\n })\n\n this._setState({ status: 'running', messages: [], connection, keyboard })\n }\n\n private _setState = (newState: ChatState) => {\n this._state = newState\n this._events.emit('state', this._state)\n }\n\n private _onMessageReceived = async (message: chat.Signals['message_created']) => {\n if (this._state.status === 'stopped') {\n return\n }\n if (message.userId === this._props.client.user.id) {\n return\n }\n const source: MessageSource = message.isBot ? 'bot' : 'other'\n this._setState({ ...this._state, messages: [...this._state.messages, { ...message, source }] })\n }\n\n private _onKeyboardInput = async (line: string) => {\n if (this._state.status === 'stopped') {\n return\n }\n\n if (EXIT_KEYWORDS.includes(line)) {\n await this._onExit()\n return\n }\n\n if (!line) {\n this._setState({ ...this._state })\n return\n }\n\n const message = this._textToMessage(line)\n this._setState({ ...this._state, messages: [...this._state.messages, message] })\n await this._props.client.createMessage(message)\n }\n\n private _onExit = async () => {\n if (this._state.status === 'stopped') {\n return\n }\n const { connection, keyboard } = this._state\n await connection.disconnect()\n connection.cleanup()\n keyboard.close()\n this._setState({ status: 'stopped' })\n this._clearStdOut()\n this._restoreOriginalScreenBuffer()\n }\n\n public wait(): Promise<void> {\n return new Promise<void>((resolve) => {\n const cb = (state: ChatState) => {\n if (state.status === 'stopped') {\n this._events.off('state', cb)\n resolve()\n }\n }\n this._events.on('state', cb)\n })\n }\n\n private _renderMessages = () => {\n if (this._state.status === 'stopped') {\n return\n }\n\n this._clearStdOut()\n this._printHeader()\n\n for (const message of this._state.messages) {\n const prefix = USER_ICONS[message.source]\n const text = this._messageToText(message)\n const coloredText = message.source === 'bot' ? text : chalk.gray(text)\n process.stdout.write(`${prefix} ${coloredText}\\n`)\n }\n\n this._state.keyboard.setPrompt('>> ')\n this._state.keyboard.prompt(true) // Redisplay the prompt and maintain current input\n }\n\n private _printHeader = () => {\n process.stdout.write(chalk.bold('Botpress Chat\\n'))\n process.stdout.write(chalk.gray('Type \"exit\" or press ESC key to quit\\n'))\n }\n\n private _switchAlternateScreenBuffer = () => {\n process.stdout.write('\\x1B[?1049h')\n }\n\n private _restoreOriginalScreenBuffer = () => {\n process.stdout.write('\\x1B[?1049l')\n }\n\n private _clearStdOut = () => {\n process.stdout.write('\\x1B[2J\\x1B[0;0H')\n }\n\n private _messageToText = (message: Pick<chat.Message, 'payload'>): string => {\n const prefix = MESSAGE_ICONS[message.payload.type]\n switch (message.payload.type) {\n case 'audio':\n return prefix + message.payload.audioUrl\n case 'card':\n return prefix + JSON.stringify(message.payload)\n case 'carousel':\n return prefix + JSON.stringify(message.payload)\n case 'choice':\n return (\n prefix +\n [message.payload.text, ...message.payload.options.map((o) => ` - ${o.label} (${o.value})`)].join('\\n')\n )\n case 'dropdown':\n return (\n prefix +\n [message.payload.text, ...message.payload.options.map((o) => ` - ${o.label} (${o.value})`)].join('\\n')\n )\n case 'file':\n return prefix + message.payload.fileUrl\n case 'image':\n return prefix + message.payload.imageUrl\n case 'location':\n return prefix + `${message.payload.latitude},${message.payload.longitude} (${message.payload.address})`\n case 'text':\n return prefix + message.payload.text\n case 'video':\n return prefix + message.payload.videoUrl\n case 'markdown':\n return prefix + message.payload.markdown\n case 'bloc':\n return [\n prefix,\n ...message.payload.items.map((item) => this._messageToText({ payload: item })).map((l) => `\\t${l}`),\n ].join('\\n')\n default:\n type _assertion = utils.types.AssertNever<typeof message.payload>\n return '<unknown>'\n }\n }\n\n private _textToMessage = (text: string): ChatMessage => {\n return {\n id: uuid.v4(),\n userId: this._props.client.user.id,\n source: 'myself',\n conversationId: this._props.conversationId,\n createdAt: new Date().toISOString(),\n payload: { type: 'text', text },\n }\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AACvB,eAA0B;AAC1B,WAAsB;AACtB,YAAuB;AAevB,MAAM,aAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AACT;AAEA,MAAM,gBAAiE;AAAA,EACrE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AACR;AAEA,MAAM,gBAAgB,CAAC,QAAQ,OAAO;AAO/B,MAAM,KAAK;AAAA,EAUR,YAAoB,QAAmB;AAAnB;AAAA,EAAoB;AAAA,EATxC,UAAU,IAAI,MAAM,QAAQ,aAAmC;AAAA,EAC/D,SAAoB,EAAE,QAAQ,UAAU;AAAA,EAEhD,OAAc,OAAO,OAAwB;AAC3C,UAAM,WAAW,IAAI,KAAK,KAAK;AAC/B,SAAK,SAAS,KAAK;AACnB,WAAO;AAAA,EACT;AAAA,EAIA,MAAc,OAAO;AACnB,SAAK,6BAA6B;AAClC,SAAK,QAAQ,GAAG,SAAS,KAAK,eAAe;AAE7C,UAAM,aAAa,MAAM,KAAK,OAAO,OAAO,mBAAmB,EAAE,IAAI,KAAK,OAAO,eAAe,CAAC;AACjG,UAAM,WAAW,SAAS,gBAAgB;AAAA,MACxC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,eAAW,GAAG,mBAAmB,CAAC,MAAM,KAAK,KAAK,mBAAmB,CAAC,CAAC;AACvE,aAAS,GAAG,QAAQ,CAAC,MAAM,KAAK,KAAK,iBAAiB,CAAC,CAAC;AACxD,YAAQ,MAAM,GAAG,YAAY,CAAC,GAAG,QAAQ;AACvC,UAAI,IAAI,SAAS,UAAU;AACzB,aAAK,KAAK,QAAQ;AAAA,MACpB;AAAA,IACF,CAAC;AAED,SAAK,UAAU,EAAE,QAAQ,WAAW,UAAU,CAAC,GAAG,YAAY,SAAS,CAAC;AAAA,EAC1E;AAAA,EAEQ,YAAY,CAAC,aAAwB;AAC3C,SAAK,SAAS;AACd,SAAK,QAAQ,KAAK,SAAS,KAAK,MAAM;AAAA,EACxC;AAAA,EAEQ,qBAAqB,OAAO,YAA6C;AAC/E,QAAI,KAAK,OAAO,WAAW,WAAW;AACpC;AAAA,IACF;AACA,QAAI,QAAQ,WAAW,KAAK,OAAO,OAAO,KAAK,IAAI;AACjD;AAAA,IACF;AACA,UAAM,SAAwB,QAAQ,QAAQ,QAAQ;AACtD,SAAK,UAAU,EAAE,GAAG,KAAK,QAAQ,UAAU,CAAC,GAAG,KAAK,OAAO,UAAU,EAAE,GAAG,SAAS,OAAO,CAAC,EAAE,CAAC;AAAA,EAChG;AAAA,EAEQ,mBAAmB,OAAO,SAAiB;AACjD,QAAI,KAAK,OAAO,WAAW,WAAW;AACpC;AAAA,IACF;AAEA,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,YAAM,KAAK,QAAQ;AACnB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,WAAK,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC;AACjC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,eAAe,IAAI;AACxC,SAAK,UAAU,EAAE,GAAG,KAAK,QAAQ,UAAU,CAAC,GAAG,KAAK,OAAO,UAAU,OAAO,EAAE,CAAC;AAC/E,UAAM,KAAK,OAAO,OAAO,cAAc,OAAO;AAAA,EAChD;AAAA,EAEQ,UAAU,YAAY;AAC5B,QAAI,KAAK,OAAO,WAAW,WAAW;AACpC;AAAA,IACF;AACA,UAAM,EAAE,YAAY,SAAS,IAAI,KAAK;AACtC,UAAM,WAAW,WAAW;AAC5B,eAAW,QAAQ;AACnB,aAAS,MAAM;AACf,SAAK,UAAU,EAAE,QAAQ,UAAU,CAAC;AACpC,SAAK,aAAa;AAClB,SAAK,6BAA6B;AAAA,EACpC;AAAA,EAEO,OAAsB;AAC3B,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,YAAM,KAAK,CAAC,UAAqB;AAC/B,YAAI,MAAM,WAAW,WAAW;AAC9B,eAAK,QAAQ,IAAI,SAAS,EAAE;AAC5B,kBAAQ;AAAA,QACV;AAAA,MACF;AACA,WAAK,QAAQ,GAAG,SAAS,EAAE;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,MAAM;AAC9B,QAAI,KAAK,OAAO,WAAW,WAAW;AACpC;AAAA,IACF;AAEA,SAAK,aAAa;AAClB,SAAK,aAAa;AAElB,eAAW,WAAW,KAAK,OAAO,UAAU;AAC1C,YAAM,SAAS,WAAW,QAAQ,MAAM;AACxC,YAAM,OAAO,KAAK,eAAe,OAAO;AACxC,YAAM,cAAc,QAAQ,WAAW,QAAQ,OAAO,MAAM,KAAK,IAAI;AACrE,cAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAe;AAAA,IACnD;AAEA,SAAK,OAAO,SAAS,UAAU,KAAK;AACpC,SAAK,OAAO,SAAS,OAAO,IAAI;AAAA,EAClC;AAAA,EAEQ,eAAe,MAAM;AAC3B,YAAQ,OAAO,MAAM,MAAM,KAAK,iBAAiB,CAAC;AAClD,YAAQ,OAAO,MAAM,MAAM,KAAK,wCAAwC,CAAC;AAAA,EAC3E;AAAA,EAEQ,+BAA+B,MAAM;AAC3C,YAAQ,OAAO,MAAM,aAAa;AAAA,EACpC;AAAA,EAEQ,+BAA+B,MAAM;AAC3C,YAAQ,OAAO,MAAM,aAAa;AAAA,EACpC;AAAA,EAEQ,eAAe,MAAM;AAC3B,YAAQ,OAAO,MAAM,kBAAkB;AAAA,EACzC;AAAA,EAEQ,iBAAiB,CAAC,YAAmD;AAC3E,UAAM,SAAS,cAAc,QAAQ,QAAQ,IAAI;AACjD,YAAQ,QAAQ,QAAQ,MAAM;AAAA,MAC5B,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO,SAAS,KAAK,UAAU,QAAQ,OAAO;AAAA,MAChD,KAAK;AACH,eAAO,SAAS,KAAK,UAAU,QAAQ,OAAO;AAAA,MAChD,KAAK;AACH,eACE,SACA,CAAC,QAAQ,QAAQ,MAAM,GAAG,QAAQ,QAAQ,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;AAAA,MAE1G,KAAK;AACH,eACE,SACA,CAAC,QAAQ,QAAQ,MAAM,GAAG,QAAQ,QAAQ,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,KAAK,IAAI;AAAA,MAE1G,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO,SAAS,GAAG,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,cAAc,QAAQ,QAAQ;AAAA,MAC/F,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO,SAAS,QAAQ,QAAQ;AAAA,MAClC,KAAK;AACH,eAAO;AAAA,UACL;AAAA,UACA,GAAG,QAAQ,QAAQ,MAAM,IAAI,CAAC,SAAS,KAAK,eAAe,EAAE,SAAS,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAK,GAAG;AAAA,QACpG,EAAE,KAAK,IAAI;AAAA,MACb;AAEE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,iBAAiB,CAAC,SAA8B;AACtD,WAAO;AAAA,MACL,IAAI,KAAK,GAAG;AAAA,MACZ,QAAQ,KAAK,OAAO,OAAO,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,gBAAgB,KAAK,OAAO;AAAA,MAC5B,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,MAClC,SAAS,EAAE,MAAM,QAAQ,KAAK;AAAA,IAChC;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -113,7 +113,8 @@ class AddCommand extends import_global_command.GlobalCommand {
113
113
  await this._uninstall(installPath);
114
114
  }
115
115
  if (ref.type === "name" && ref.version === pkgRef.LATEST_TAG) {
116
- targetPackage.pkg.version = `^${import_semver.default.major(targetPackage.pkg.version)}.0.0`;
116
+ const major = import_semver.default.major(targetPackage.pkg.version);
117
+ targetPackage.pkg.version = `>=${major}.0.0 <${major + 1}.0.0`;
117
118
  this.logger.log(
118
119
  `Dependency "${packageName}" will be installed with version "${targetPackage.pkg.version}". To pin a specific version or version range, please change "${targetPackage.type}:${packageName}@latest" to a specific version number or range instead of "latest".`
119
120
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/command-implementations/add-command.ts"],
4
- "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport * as fslib from 'fs'\nimport * as pathlib from 'path'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as pkgRef from '../package-ref'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\nimport { ProjectCache, ProjectCommand, ProjectCommandDefinition, ProjectDefinition } from './project-command'\n\ntype InstallablePackage =\n | {\n type: 'integration'\n pkg: codegen.IntegrationInstallablePackage\n }\n | {\n type: 'interface'\n pkg: codegen.InterfaceInstallablePackage\n }\n | {\n type: 'plugin'\n pkg: codegen.PluginInstallablePackage\n }\n\nexport type AddCommandDefinition = typeof commandDefinitions.add\nexport class AddCommand extends GlobalCommand<AddCommandDefinition> {\n public async run(): Promise<void> {\n const ref = this._parseArgvRef()\n if (ref) {\n return await this._addSinglePackage(ref)\n }\n\n const pkgJson = await utils.pkgJson.readPackageJson(this.argv.installPath)\n if (!pkgJson) {\n this.logger.warn('No package.json found in the install path')\n return\n }\n\n const { bpDependencies } = pkgJson\n if (!bpDependencies) {\n this.logger.log('No bp dependencies found in package.json')\n return\n }\n\n const bpDependenciesSchema = sdk.z.record(sdk.z.string())\n const parseResults = bpDependenciesSchema.safeParse(bpDependencies)\n if (!parseResults.success) {\n throw new errors.BotpressCLIError('Invalid bpDependencies found in package.json')\n }\n\n for (const [pkgAlias, pkgRefStr] of Object.entries(parseResults.data)) {\n const parsed = pkgRef.parsePackageRef(pkgRefStr)\n if (!parsed) {\n throw new errors.InvalidPackageReferenceError(pkgRefStr)\n }\n\n await this._addSinglePackage({ ...parsed, alias: pkgAlias })\n }\n }\n\n private _parseArgvRef = (): pkgRef.PackageRef | undefined => {\n if (!this.argv.packageRef) {\n return\n }\n\n const parsed = pkgRef.parsePackageRef(this.argv.packageRef)\n if (!parsed) {\n throw new errors.InvalidPackageReferenceError(this.argv.packageRef)\n }\n\n if (parsed.type !== 'name') {\n return parsed\n }\n\n const argvPkgType = this.argv.packageType\n if (!argvPkgType) {\n return parsed\n }\n\n const ref = { ...parsed, pkg: argvPkgType }\n\n const strRef = pkgRef.formatPackageRef(ref)\n this.logger.warn(`argument --packageType is deprecated; please use the package reference format \"${strRef}\"`)\n\n return ref\n }\n\n private async _addSinglePackage(ref: pkgRef.PackageRef & { alias?: string }): Promise<void> {\n const targetPackage = ref.type === 'path' ? await this._findLocalPackage(ref) : await this._findRemotePackage(ref)\n\n if (!targetPackage) {\n const strRef = pkgRef.formatPackageRef(ref)\n throw new errors.BotpressCLIError(`Could not find package \"${strRef}\"`)\n }\n\n const packageName = ref.alias ?? targetPackage.pkg.name\n const baseInstallPath = utils.path.absoluteFrom(utils.path.cwd(), this.argv.installPath)\n const packageDirName = utils.casing.to.kebabCase(packageName)\n const installPath = utils.path.join(baseInstallPath, consts.installDirName, packageDirName)\n\n const alreadyInstalled = fslib.existsSync(installPath)\n if (alreadyInstalled) {\n this.logger.warn(`Package with name \"${packageName}\" already installed.`)\n const res = await this.prompt.confirm('Do you want to overwrite the existing package?')\n if (!res) {\n this.logger.log('Aborted')\n return\n }\n\n await this._uninstall(installPath)\n }\n\n if (ref.type === 'name' && ref.version === pkgRef.LATEST_TAG) {\n // If the semver version expression is 'latest', we assume the project\n // is compatible with all versions of the latest major:\n targetPackage.pkg.version = `^${semver.major(targetPackage.pkg.version)}.0.0`\n\n this.logger.log(\n `Dependency \"${packageName}\" will be installed with version \"${targetPackage.pkg.version}\". ` +\n `To pin a specific version or version range, please change \"${targetPackage.type}:${packageName}@latest\" ` +\n 'to a specific version number or range instead of \"latest\".'\n )\n } else if (ref.type === 'name') {\n // Preserve the semver version expression in the generated code:\n targetPackage.pkg.version = ref.version\n }\n\n let files: codegen.File[]\n if (targetPackage.type === 'integration') {\n files = await codegen.generateIntegrationPackage(targetPackage.pkg)\n } else if (targetPackage.type === 'interface') {\n files = await codegen.generateInterfacePackage(targetPackage.pkg)\n } else if (targetPackage.type === 'plugin') {\n files = await codegen.generatePluginPackage(targetPackage.pkg)\n } else {\n type _assertion = utils.types.AssertNever<typeof targetPackage>\n throw new errors.BotpressCLIError('Invalid package type')\n }\n\n await this._install(installPath, files)\n }\n\n private async _findRemotePackage(ref: pkgRef.ApiPackageRef): Promise<InstallablePackage | undefined> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n if (this._pkgCouldBe(ref, 'integration')) {\n const integration = await api.findPublicOrPrivateIntegration(ref)\n if (integration) {\n const { name, version } = integration\n return { type: 'integration', pkg: { integration, name, version } }\n }\n }\n if (this._pkgCouldBe(ref, 'interface')) {\n const intrface = await api.findPublicOrPrivateInterface(ref)\n if (intrface) {\n const { name, version } = intrface\n return { type: 'interface', pkg: { interface: intrface, name, version } }\n }\n }\n if (this._pkgCouldBe(ref, 'plugin')) {\n const plugin = await api.findPublicOrPrivatePlugin(ref)\n if (plugin) {\n const { code } = plugin.public\n ? await api.client.getPublicPluginCode({ id: plugin.id, platform: 'node' })\n : await api.client.getPluginCode({ id: plugin.id, platform: 'node' })\n const { name, version } = plugin\n return {\n type: 'plugin',\n pkg: {\n name,\n version,\n plugin,\n code,\n },\n }\n }\n }\n return\n }\n\n private async _findLocalPackage(ref: pkgRef.LocalPackageRef): Promise<InstallablePackage | undefined> {\n const absPath = utils.path.absoluteFrom(utils.path.cwd(), ref.path)\n const {\n definition: projectDefinition,\n implementation: projectImplementation,\n devId: projectDevId,\n } = await this._readProject(absPath)\n\n if (projectDefinition?.type === 'integration') {\n const { name, version } = projectDefinition.definition\n let devId: string | undefined\n if (this.argv.useDev && projectDevId) {\n this.logger.warn(`Installing integration \"${name}\" with dev version \"${projectDevId}\"`)\n devId = projectDevId\n }\n\n let createIntegrationReqBody = await this._getProjectCmd(ref.path).prepareCreateIntegrationBody(\n projectDefinition.definition\n )\n createIntegrationReqBody = {\n ...createIntegrationReqBody,\n interfaces: utils.records.mapValues(projectDefinition.definition.interfaces ?? {}, (i) => ({\n id: '', // TODO: do this better\n ...i,\n })),\n }\n return {\n type: 'integration',\n pkg: { path: absPath, devId, name, version, integration: createIntegrationReqBody },\n }\n }\n\n if (projectDefinition?.type === 'interface') {\n const { name, version } = projectDefinition.definition\n const createInterfaceReqBody = await apiUtils.prepareCreateInterfaceBody(projectDefinition.definition)\n return {\n type: 'interface',\n pkg: { path: absPath, name, version, interface: createInterfaceReqBody },\n }\n }\n\n if (projectDefinition?.type === 'plugin') {\n if (!projectImplementation) {\n throw new errors.BotpressCLIError(\n 'Plugin implementation not found; Please build the plugin project before installing'\n )\n }\n\n const pluginDefinition = projectDefinition.definition\n const { name, version } = pluginDefinition\n const code = projectImplementation\n\n const createPluginReqBody = await apiUtils.prepareCreatePluginBody(pluginDefinition)\n return {\n type: 'plugin',\n pkg: {\n path: absPath,\n name,\n version,\n code,\n plugin: {\n ...createPluginReqBody,\n dependencies: {\n interfaces: await utils.promises.awaitRecord(\n utils.records.mapValues(pluginDefinition.interfaces ?? {}, apiUtils.prepareCreateInterfaceBody)\n ),\n integrations: await utils.promises.awaitRecord(\n utils.records.mapValues(pluginDefinition.integrations ?? {}, apiUtils.prepareCreateIntegrationBody)\n ),\n },\n recurringEvents: pluginDefinition.recurringEvents,\n },\n },\n }\n }\n\n if (projectDefinition?.type === 'bot') {\n throw new errors.BotpressCLIError('Cannot install a bot as a package')\n }\n return\n }\n\n private async _install(installPath: utils.path.AbsolutePath, files: codegen.File[]): Promise<void> {\n const line = this.logger.line()\n line.started(`Installing ${files.length} files to \"${installPath}\"`)\n try {\n for (const file of files) {\n const filePath = utils.path.absoluteFrom(installPath, file.path)\n const dirPath = pathlib.dirname(filePath)\n await fslib.promises.mkdir(dirPath, { recursive: true })\n await fslib.promises.writeFile(filePath, file.content)\n }\n line.success(`Installed ${files.length} files to \"${installPath}\"`)\n } finally {\n line.commit()\n }\n }\n\n private async _uninstall(installPath: utils.path.AbsolutePath): Promise<void> {\n await fslib.promises.rm(installPath, { recursive: true })\n }\n\n private async _readProject(workDir: utils.path.AbsolutePath): Promise<{\n definition?: ProjectDefinition\n implementation?: string\n devId?: string\n }> {\n const cmd = this._getProjectCmd(workDir)\n\n const definition = await cmd.readProjectDefinitionFromFS().catch((thrown) => {\n if (thrown instanceof errors.ProjectDefinitionNotFoundError) {\n return undefined\n }\n throw thrown\n })\n\n const devId = await cmd.projectCache.get('devId')\n\n const implementationAbsPath = utils.path.join(workDir, consts.fromWorkDir.outFileCJS)\n if (!fslib.existsSync(implementationAbsPath)) {\n return { definition, devId }\n }\n\n const implementation = await fslib.promises.readFile(implementationAbsPath, 'utf8')\n return { definition, implementation, devId }\n }\n\n private _pkgCouldBe = (ref: pkgRef.ApiPackageRef, pkgType: InstallablePackage['type']) => {\n if (ref.type === 'id') {\n // TODO: use ULID prefixes to determine the type of the package\n return true\n }\n if (!ref.pkg) {\n return true // ref does not specify the package type\n }\n return ref.pkg === pkgType\n }\n\n private _getProjectCmd(workDir: string): _AnyProjectCommand {\n return new _AnyProjectCommand(apiUtils.ApiClient, this.prompt, this.logger, {\n ...this.argv,\n workDir,\n })\n }\n}\n\n// this is a hack to avoid refactoring the project command class\nclass _AnyProjectCommand extends ProjectCommand<ProjectCommandDefinition> {\n public async run(): Promise<void> {\n throw new errors.BotpressCLIError('Not implemented')\n }\n\n public async readProjectDefinitionFromFS(): Promise<ProjectDefinition> {\n return super.readProjectDefinitionFromFS()\n }\n\n public async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n return super.prepareCreateIntegrationBody(integrationDef)\n }\n\n public get projectCache(): utils.cache.FSKeyValueCache<ProjectCache> {\n return super.projectCache\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as sdk from '@botpress/sdk'\nimport * as fslib from 'fs'\nimport * as pathlib from 'path'\nimport semver from 'semver'\nimport * as apiUtils from '../api'\nimport * as codegen from '../code-generation'\nimport type commandDefinitions from '../command-definitions'\nimport * as consts from '../consts'\nimport * as errors from '../errors'\nimport * as pkgRef from '../package-ref'\nimport * as utils from '../utils'\nimport { GlobalCommand } from './global-command'\nimport { ProjectCache, ProjectCommand, ProjectCommandDefinition, ProjectDefinition } from './project-command'\n\ntype InstallablePackage =\n | {\n type: 'integration'\n pkg: codegen.IntegrationInstallablePackage\n }\n | {\n type: 'interface'\n pkg: codegen.InterfaceInstallablePackage\n }\n | {\n type: 'plugin'\n pkg: codegen.PluginInstallablePackage\n }\n\nexport type AddCommandDefinition = typeof commandDefinitions.add\nexport class AddCommand extends GlobalCommand<AddCommandDefinition> {\n public async run(): Promise<void> {\n const ref = this._parseArgvRef()\n if (ref) {\n return await this._addSinglePackage(ref)\n }\n\n const pkgJson = await utils.pkgJson.readPackageJson(this.argv.installPath)\n if (!pkgJson) {\n this.logger.warn('No package.json found in the install path')\n return\n }\n\n const { bpDependencies } = pkgJson\n if (!bpDependencies) {\n this.logger.log('No bp dependencies found in package.json')\n return\n }\n\n const bpDependenciesSchema = sdk.z.record(sdk.z.string())\n const parseResults = bpDependenciesSchema.safeParse(bpDependencies)\n if (!parseResults.success) {\n throw new errors.BotpressCLIError('Invalid bpDependencies found in package.json')\n }\n\n for (const [pkgAlias, pkgRefStr] of Object.entries(parseResults.data)) {\n const parsed = pkgRef.parsePackageRef(pkgRefStr)\n if (!parsed) {\n throw new errors.InvalidPackageReferenceError(pkgRefStr)\n }\n\n await this._addSinglePackage({ ...parsed, alias: pkgAlias })\n }\n }\n\n private _parseArgvRef = (): pkgRef.PackageRef | undefined => {\n if (!this.argv.packageRef) {\n return\n }\n\n const parsed = pkgRef.parsePackageRef(this.argv.packageRef)\n if (!parsed) {\n throw new errors.InvalidPackageReferenceError(this.argv.packageRef)\n }\n\n if (parsed.type !== 'name') {\n return parsed\n }\n\n const argvPkgType = this.argv.packageType\n if (!argvPkgType) {\n return parsed\n }\n\n const ref = { ...parsed, pkg: argvPkgType }\n\n const strRef = pkgRef.formatPackageRef(ref)\n this.logger.warn(`argument --packageType is deprecated; please use the package reference format \"${strRef}\"`)\n\n return ref\n }\n\n private async _addSinglePackage(ref: pkgRef.PackageRef & { alias?: string }): Promise<void> {\n const targetPackage = ref.type === 'path' ? await this._findLocalPackage(ref) : await this._findRemotePackage(ref)\n\n if (!targetPackage) {\n const strRef = pkgRef.formatPackageRef(ref)\n throw new errors.BotpressCLIError(`Could not find package \"${strRef}\"`)\n }\n\n const packageName = ref.alias ?? targetPackage.pkg.name\n const baseInstallPath = utils.path.absoluteFrom(utils.path.cwd(), this.argv.installPath)\n const packageDirName = utils.casing.to.kebabCase(packageName)\n const installPath = utils.path.join(baseInstallPath, consts.installDirName, packageDirName)\n\n const alreadyInstalled = fslib.existsSync(installPath)\n if (alreadyInstalled) {\n this.logger.warn(`Package with name \"${packageName}\" already installed.`)\n const res = await this.prompt.confirm('Do you want to overwrite the existing package?')\n if (!res) {\n this.logger.log('Aborted')\n return\n }\n\n await this._uninstall(installPath)\n }\n\n if (ref.type === 'name' && ref.version === pkgRef.LATEST_TAG) {\n // If the semver version expression is 'latest', we assume the project\n // is compatible with all versions of the latest major:\n const major = semver.major(targetPackage.pkg.version)\n targetPackage.pkg.version = `>=${major}.0.0 <${major + 1}.0.0`\n\n this.logger.log(\n `Dependency \"${packageName}\" will be installed with version \"${targetPackage.pkg.version}\". ` +\n `To pin a specific version or version range, please change \"${targetPackage.type}:${packageName}@latest\" ` +\n 'to a specific version number or range instead of \"latest\".'\n )\n } else if (ref.type === 'name') {\n // Preserve the semver version expression in the generated code:\n targetPackage.pkg.version = ref.version\n }\n\n let files: codegen.File[]\n if (targetPackage.type === 'integration') {\n files = await codegen.generateIntegrationPackage(targetPackage.pkg)\n } else if (targetPackage.type === 'interface') {\n files = await codegen.generateInterfacePackage(targetPackage.pkg)\n } else if (targetPackage.type === 'plugin') {\n files = await codegen.generatePluginPackage(targetPackage.pkg)\n } else {\n type _assertion = utils.types.AssertNever<typeof targetPackage>\n throw new errors.BotpressCLIError('Invalid package type')\n }\n\n await this._install(installPath, files)\n }\n\n private async _findRemotePackage(ref: pkgRef.ApiPackageRef): Promise<InstallablePackage | undefined> {\n const api = await this.ensureLoginAndCreateClient(this.argv)\n if (this._pkgCouldBe(ref, 'integration')) {\n const integration = await api.findPublicOrPrivateIntegration(ref)\n if (integration) {\n const { name, version } = integration\n return { type: 'integration', pkg: { integration, name, version } }\n }\n }\n if (this._pkgCouldBe(ref, 'interface')) {\n const intrface = await api.findPublicOrPrivateInterface(ref)\n if (intrface) {\n const { name, version } = intrface\n return { type: 'interface', pkg: { interface: intrface, name, version } }\n }\n }\n if (this._pkgCouldBe(ref, 'plugin')) {\n const plugin = await api.findPublicOrPrivatePlugin(ref)\n if (plugin) {\n const { code } = plugin.public\n ? await api.client.getPublicPluginCode({ id: plugin.id, platform: 'node' })\n : await api.client.getPluginCode({ id: plugin.id, platform: 'node' })\n const { name, version } = plugin\n return {\n type: 'plugin',\n pkg: {\n name,\n version,\n plugin,\n code,\n },\n }\n }\n }\n return\n }\n\n private async _findLocalPackage(ref: pkgRef.LocalPackageRef): Promise<InstallablePackage | undefined> {\n const absPath = utils.path.absoluteFrom(utils.path.cwd(), ref.path)\n const {\n definition: projectDefinition,\n implementation: projectImplementation,\n devId: projectDevId,\n } = await this._readProject(absPath)\n\n if (projectDefinition?.type === 'integration') {\n const { name, version } = projectDefinition.definition\n let devId: string | undefined\n if (this.argv.useDev && projectDevId) {\n this.logger.warn(`Installing integration \"${name}\" with dev version \"${projectDevId}\"`)\n devId = projectDevId\n }\n\n let createIntegrationReqBody = await this._getProjectCmd(ref.path).prepareCreateIntegrationBody(\n projectDefinition.definition\n )\n createIntegrationReqBody = {\n ...createIntegrationReqBody,\n interfaces: utils.records.mapValues(projectDefinition.definition.interfaces ?? {}, (i) => ({\n id: '', // TODO: do this better\n ...i,\n })),\n }\n return {\n type: 'integration',\n pkg: { path: absPath, devId, name, version, integration: createIntegrationReqBody },\n }\n }\n\n if (projectDefinition?.type === 'interface') {\n const { name, version } = projectDefinition.definition\n const createInterfaceReqBody = await apiUtils.prepareCreateInterfaceBody(projectDefinition.definition)\n return {\n type: 'interface',\n pkg: { path: absPath, name, version, interface: createInterfaceReqBody },\n }\n }\n\n if (projectDefinition?.type === 'plugin') {\n if (!projectImplementation) {\n throw new errors.BotpressCLIError(\n 'Plugin implementation not found; Please build the plugin project before installing'\n )\n }\n\n const pluginDefinition = projectDefinition.definition\n const { name, version } = pluginDefinition\n const code = projectImplementation\n\n const createPluginReqBody = await apiUtils.prepareCreatePluginBody(pluginDefinition)\n return {\n type: 'plugin',\n pkg: {\n path: absPath,\n name,\n version,\n code,\n plugin: {\n ...createPluginReqBody,\n dependencies: {\n interfaces: await utils.promises.awaitRecord(\n utils.records.mapValues(pluginDefinition.interfaces ?? {}, apiUtils.prepareCreateInterfaceBody)\n ),\n integrations: await utils.promises.awaitRecord(\n utils.records.mapValues(pluginDefinition.integrations ?? {}, apiUtils.prepareCreateIntegrationBody)\n ),\n },\n recurringEvents: pluginDefinition.recurringEvents,\n },\n },\n }\n }\n\n if (projectDefinition?.type === 'bot') {\n throw new errors.BotpressCLIError('Cannot install a bot as a package')\n }\n return\n }\n\n private async _install(installPath: utils.path.AbsolutePath, files: codegen.File[]): Promise<void> {\n const line = this.logger.line()\n line.started(`Installing ${files.length} files to \"${installPath}\"`)\n try {\n for (const file of files) {\n const filePath = utils.path.absoluteFrom(installPath, file.path)\n const dirPath = pathlib.dirname(filePath)\n await fslib.promises.mkdir(dirPath, { recursive: true })\n await fslib.promises.writeFile(filePath, file.content)\n }\n line.success(`Installed ${files.length} files to \"${installPath}\"`)\n } finally {\n line.commit()\n }\n }\n\n private async _uninstall(installPath: utils.path.AbsolutePath): Promise<void> {\n await fslib.promises.rm(installPath, { recursive: true })\n }\n\n private async _readProject(workDir: utils.path.AbsolutePath): Promise<{\n definition?: ProjectDefinition\n implementation?: string\n devId?: string\n }> {\n const cmd = this._getProjectCmd(workDir)\n\n const definition = await cmd.readProjectDefinitionFromFS().catch((thrown) => {\n if (thrown instanceof errors.ProjectDefinitionNotFoundError) {\n return undefined\n }\n throw thrown\n })\n\n const devId = await cmd.projectCache.get('devId')\n\n const implementationAbsPath = utils.path.join(workDir, consts.fromWorkDir.outFileCJS)\n if (!fslib.existsSync(implementationAbsPath)) {\n return { definition, devId }\n }\n\n const implementation = await fslib.promises.readFile(implementationAbsPath, 'utf8')\n return { definition, implementation, devId }\n }\n\n private _pkgCouldBe = (ref: pkgRef.ApiPackageRef, pkgType: InstallablePackage['type']) => {\n if (ref.type === 'id') {\n // TODO: use ULID prefixes to determine the type of the package\n return true\n }\n if (!ref.pkg) {\n return true // ref does not specify the package type\n }\n return ref.pkg === pkgType\n }\n\n private _getProjectCmd(workDir: string): _AnyProjectCommand {\n return new _AnyProjectCommand(apiUtils.ApiClient, this.prompt, this.logger, {\n ...this.argv,\n workDir,\n })\n }\n}\n\n// this is a hack to avoid refactoring the project command class\nclass _AnyProjectCommand extends ProjectCommand<ProjectCommandDefinition> {\n public async run(): Promise<void> {\n throw new errors.BotpressCLIError('Not implemented')\n }\n\n public async readProjectDefinitionFromFS(): Promise<ProjectDefinition> {\n return super.readProjectDefinitionFromFS()\n }\n\n public async prepareCreateIntegrationBody(\n integrationDef: sdk.IntegrationDefinition\n ): Promise<apiUtils.CreateIntegrationRequestBody> {\n return super.prepareCreateIntegrationBody(integrationDef)\n }\n\n public get projectCache(): utils.cache.FSKeyValueCache<ProjectCache> {\n return super.projectCache\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAqB;AACrB,YAAuB;AACvB,cAAyB;AACzB,oBAAmB;AACnB,eAA0B;AAC1B,cAAyB;AAEzB,aAAwB;AACxB,aAAwB;AACxB,aAAwB;AACxB,YAAuB;AACvB,4BAA8B;AAC9B,6BAA0F;AAiBnF,MAAM,mBAAmB,oCAAoC;AAAA,EAClE,MAAa,MAAqB;AAChC,UAAM,MAAM,KAAK,cAAc;AAC/B,QAAI,KAAK;AACP,aAAO,MAAM,KAAK,kBAAkB,GAAG;AAAA,IACzC;AAEA,UAAM,UAAU,MAAM,MAAM,QAAQ,gBAAgB,KAAK,KAAK,WAAW;AACzE,QAAI,CAAC,SAAS;AACZ,WAAK,OAAO,KAAK,2CAA2C;AAC5D;AAAA,IACF;AAEA,UAAM,EAAE,eAAe,IAAI;AAC3B,QAAI,CAAC,gBAAgB;AACnB,WAAK,OAAO,IAAI,0CAA0C;AAC1D;AAAA,IACF;AAEA,UAAM,uBAAuB,IAAI,EAAE,OAAO,IAAI,EAAE,OAAO,CAAC;AACxD,UAAM,eAAe,qBAAqB,UAAU,cAAc;AAClE,QAAI,CAAC,aAAa,SAAS;AACzB,YAAM,IAAI,OAAO,iBAAiB,8CAA8C;AAAA,IAClF;AAEA,eAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,aAAa,IAAI,GAAG;AACrE,YAAM,SAAS,OAAO,gBAAgB,SAAS;AAC/C,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,OAAO,6BAA6B,SAAS;AAAA,MACzD;AAEA,YAAM,KAAK,kBAAkB,EAAE,GAAG,QAAQ,OAAO,SAAS,CAAC;AAAA,IAC7D;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAqC;AAC3D,QAAI,CAAC,KAAK,KAAK,YAAY;AACzB;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,gBAAgB,KAAK,KAAK,UAAU;AAC1D,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,OAAO,6BAA6B,KAAK,KAAK,UAAU;AAAA,IACpE;AAEA,QAAI,OAAO,SAAS,QAAQ;AAC1B,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,KAAK;AAC9B,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,EAAE,GAAG,QAAQ,KAAK,YAAY;AAE1C,UAAM,SAAS,OAAO,iBAAiB,GAAG;AAC1C,SAAK,OAAO,KAAK,kFAAkF,SAAS;AAE5G,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,kBAAkB,KAA4D;AAC1F,UAAM,gBAAgB,IAAI,SAAS,SAAS,MAAM,KAAK,kBAAkB,GAAG,IAAI,MAAM,KAAK,mBAAmB,GAAG;AAEjH,QAAI,CAAC,eAAe;AAClB,YAAM,SAAS,OAAO,iBAAiB,GAAG;AAC1C,YAAM,IAAI,OAAO,iBAAiB,2BAA2B,SAAS;AAAA,IACxE;AAEA,UAAM,cAAc,IAAI,SAAS,cAAc,IAAI;AACnD,UAAM,kBAAkB,MAAM,KAAK,aAAa,MAAM,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW;AACvF,UAAM,iBAAiB,MAAM,OAAO,GAAG,UAAU,WAAW;AAC5D,UAAM,cAAc,MAAM,KAAK,KAAK,iBAAiB,OAAO,gBAAgB,cAAc;AAE1F,UAAM,mBAAmB,MAAM,WAAW,WAAW;AACrD,QAAI,kBAAkB;AACpB,WAAK,OAAO,KAAK,sBAAsB,iCAAiC;AACxE,YAAM,MAAM,MAAM,KAAK,OAAO,QAAQ,gDAAgD;AACtF,UAAI,CAAC,KAAK;AACR,aAAK,OAAO,IAAI,SAAS;AACzB;AAAA,MACF;AAEA,YAAM,KAAK,WAAW,WAAW;AAAA,IACnC;AAEA,QAAI,IAAI,SAAS,UAAU,IAAI,YAAY,OAAO,YAAY;AAG5D,YAAM,QAAQ,cAAAA,QAAO,MAAM,cAAc,IAAI,OAAO;AACpD,oBAAc,IAAI,UAAU,KAAK,cAAc,QAAQ;AAEvD,WAAK,OAAO;AAAA,QACV,eAAe,gDAAgD,cAAc,IAAI,wEACjB,cAAc,QAAQ;AAAA,MAExF;AAAA,IACF,WAAW,IAAI,SAAS,QAAQ;AAE9B,oBAAc,IAAI,UAAU,IAAI;AAAA,IAClC;AAEA,QAAI;AACJ,QAAI,cAAc,SAAS,eAAe;AACxC,cAAQ,MAAM,QAAQ,2BAA2B,cAAc,GAAG;AAAA,IACpE,WAAW,cAAc,SAAS,aAAa;AAC7C,cAAQ,MAAM,QAAQ,yBAAyB,cAAc,GAAG;AAAA,IAClE,WAAW,cAAc,SAAS,UAAU;AAC1C,cAAQ,MAAM,QAAQ,sBAAsB,cAAc,GAAG;AAAA,IAC/D,OAAO;AAEL,YAAM,IAAI,OAAO,iBAAiB,sBAAsB;AAAA,IAC1D;AAEA,UAAM,KAAK,SAAS,aAAa,KAAK;AAAA,EACxC;AAAA,EAEA,MAAc,mBAAmB,KAAoE;AACnG,UAAM,MAAM,MAAM,KAAK,2BAA2B,KAAK,IAAI;AAC3D,QAAI,KAAK,YAAY,KAAK,aAAa,GAAG;AACxC,YAAM,cAAc,MAAM,IAAI,+BAA+B,GAAG;AAChE,UAAI,aAAa;AACf,cAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,eAAO,EAAE,MAAM,eAAe,KAAK,EAAE,aAAa,MAAM,QAAQ,EAAE;AAAA,MACpE;AAAA,IACF;AACA,QAAI,KAAK,YAAY,KAAK,WAAW,GAAG;AACtC,YAAM,WAAW,MAAM,IAAI,6BAA6B,GAAG;AAC3D,UAAI,UAAU;AACZ,cAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,eAAO,EAAE,MAAM,aAAa,KAAK,EAAE,WAAW,UAAU,MAAM,QAAQ,EAAE;AAAA,MAC1E;AAAA,IACF;AACA,QAAI,KAAK,YAAY,KAAK,QAAQ,GAAG;AACnC,YAAM,SAAS,MAAM,IAAI,0BAA0B,GAAG;AACtD,UAAI,QAAQ;AACV,cAAM,EAAE,KAAK,IAAI,OAAO,SACpB,MAAM,IAAI,OAAO,oBAAoB,EAAE,IAAI,OAAO,IAAI,UAAU,OAAO,CAAC,IACxE,MAAM,IAAI,OAAO,cAAc,EAAE,IAAI,OAAO,IAAI,UAAU,OAAO,CAAC;AACtE,cAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,eAAO;AAAA,UACL,MAAM;AAAA,UACN,KAAK;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,KAAsE;AACpG,UAAM,UAAU,MAAM,KAAK,aAAa,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI;AAClE,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,OAAO;AAAA,IACT,IAAI,MAAM,KAAK,aAAa,OAAO;AAEnC,QAAI,mBAAmB,SAAS,eAAe;AAC7C,YAAM,EAAE,MAAM,QAAQ,IAAI,kBAAkB;AAC5C,UAAI;AACJ,UAAI,KAAK,KAAK,UAAU,cAAc;AACpC,aAAK,OAAO,KAAK,2BAA2B,2BAA2B,eAAe;AACtF,gBAAQ;AAAA,MACV;AAEA,UAAI,2BAA2B,MAAM,KAAK,eAAe,IAAI,IAAI,EAAE;AAAA,QACjE,kBAAkB;AAAA,MACpB;AACA,iCAA2B;AAAA,QACzB,GAAG;AAAA,QACH,YAAY,MAAM,QAAQ,UAAU,kBAAkB,WAAW,cAAc,CAAC,GAAG,CAAC,OAAO;AAAA,UACzF,IAAI;AAAA;AAAA,UACJ,GAAG;AAAA,QACL,EAAE;AAAA,MACJ;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,EAAE,MAAM,SAAS,OAAO,MAAM,SAAS,aAAa,yBAAyB;AAAA,MACpF;AAAA,IACF;AAEA,QAAI,mBAAmB,SAAS,aAAa;AAC3C,YAAM,EAAE,MAAM,QAAQ,IAAI,kBAAkB;AAC5C,YAAM,yBAAyB,MAAM,SAAS,2BAA2B,kBAAkB,UAAU;AACrG,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,EAAE,MAAM,SAAS,MAAM,SAAS,WAAW,uBAAuB;AAAA,MACzE;AAAA,IACF;AAEA,QAAI,mBAAmB,SAAS,UAAU;AACxC,UAAI,CAAC,uBAAuB;AAC1B,cAAM,IAAI,OAAO;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,YAAM,mBAAmB,kBAAkB;AAC3C,YAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,YAAM,OAAO;AAEb,YAAM,sBAAsB,MAAM,SAAS,wBAAwB,gBAAgB;AACnF,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,UACH,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,GAAG;AAAA,YACH,cAAc;AAAA,cACZ,YAAY,MAAM,MAAM,SAAS;AAAA,gBAC/B,MAAM,QAAQ,UAAU,iBAAiB,cAAc,CAAC,GAAG,SAAS,0BAA0B;AAAA,cAChG;AAAA,cACA,cAAc,MAAM,MAAM,SAAS;AAAA,gBACjC,MAAM,QAAQ,UAAU,iBAAiB,gBAAgB,CAAC,GAAG,SAAS,4BAA4B;AAAA,cACpG;AAAA,YACF;AAAA,YACA,iBAAiB,iBAAiB;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB,SAAS,OAAO;AACrC,YAAM,IAAI,OAAO,iBAAiB,mCAAmC;AAAA,IACvE;AACA;AAAA,EACF;AAAA,EAEA,MAAc,SAAS,aAAsC,OAAsC;AACjG,UAAM,OAAO,KAAK,OAAO,KAAK;AAC9B,SAAK,QAAQ,cAAc,MAAM,oBAAoB,cAAc;AACnE,QAAI;AACF,iBAAW,QAAQ,OAAO;AACxB,cAAM,WAAW,MAAM,KAAK,aAAa,aAAa,KAAK,IAAI;AAC/D,cAAM,UAAU,QAAQ,QAAQ,QAAQ;AACxC,cAAM,MAAM,SAAS,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACvD,cAAM,MAAM,SAAS,UAAU,UAAU,KAAK,OAAO;AAAA,MACvD;AACA,WAAK,QAAQ,aAAa,MAAM,oBAAoB,cAAc;AAAA,IACpE,UAAE;AACA,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,aAAqD;AAC5E,UAAM,MAAM,SAAS,GAAG,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAc,aAAa,SAIxB;AACD,UAAM,MAAM,KAAK,eAAe,OAAO;AAEvC,UAAM,aAAa,MAAM,IAAI,4BAA4B,EAAE,MAAM,CAAC,WAAW;AAC3E,UAAI,kBAAkB,OAAO,gCAAgC;AAC3D,eAAO;AAAA,MACT;AACA,YAAM;AAAA,IACR,CAAC;AAED,UAAM,QAAQ,MAAM,IAAI,aAAa,IAAI,OAAO;AAEhD,UAAM,wBAAwB,MAAM,KAAK,KAAK,SAAS,OAAO,YAAY,UAAU;AACpF,QAAI,CAAC,MAAM,WAAW,qBAAqB,GAAG;AAC5C,aAAO,EAAE,YAAY,MAAM;AAAA,IAC7B;AAEA,UAAM,iBAAiB,MAAM,MAAM,SAAS,SAAS,uBAAuB,MAAM;AAClF,WAAO,EAAE,YAAY,gBAAgB,MAAM;AAAA,EAC7C;AAAA,EAEQ,cAAc,CAAC,KAA2B,YAAwC;AACxF,QAAI,IAAI,SAAS,MAAM;AAErB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,IAAI,KAAK;AACZ,aAAO;AAAA,IACT;AACA,WAAO,IAAI,QAAQ;AAAA,EACrB;AAAA,EAEQ,eAAe,SAAqC;AAC1D,WAAO,IAAI,mBAAmB,SAAS,WAAW,KAAK,QAAQ,KAAK,QAAQ;AAAA,MAC1E,GAAG,KAAK;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGA,MAAM,2BAA2B,sCAAyC;AAAA,EACxE,MAAa,MAAqB;AAChC,UAAM,IAAI,OAAO,iBAAiB,iBAAiB;AAAA,EACrD;AAAA,EAEA,MAAa,8BAA0D;AACrE,WAAO,MAAM,4BAA4B;AAAA,EAC3C;AAAA,EAEA,MAAa,6BACX,gBACgD;AAChD,WAAO,MAAM,6BAA6B,cAAc;AAAA,EAC1D;AAAA,EAEA,IAAW,eAA0D;AACnE,WAAO,MAAM;AAAA,EACf;AACF;",
6
6
  "names": ["semver"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botpress/cli",
3
- "version": "4.17.2",
3
+ "version": "4.17.3",
4
4
  "description": "Botpress CLI",
5
5
  "scripts": {
6
6
  "build": "pnpm run bundle && pnpm run template:gen",