=> {
+ const stateResult = await client
+ .getState({ type: 'integration', name: 'credentials', id: integrationId })
+ .catch((thrown: unknown) => {
+ const err = thrown instanceof Error ? thrown : new Error(String(thrown))
+ if (err.message.toLowerCase().includes('not found')) {
+ return null
+ }
+ throw err
+ })
+
+ const botToken = stateResult?.state.payload.botToken ?? legacyToken
+ if (typeof botToken !== 'string' || botToken.trim().length === 0) {
+ throw new RuntimeError('Bot token is missing or invalid. Please complete the wizard setup again.')
+ }
+
+ return botToken
+}
diff --git a/integrations/telegram/src/index.ts b/integrations/telegram/src/index.ts
index d912b6636ab..b4250689eeb 100644
--- a/integrations/telegram/src/index.ts
+++ b/integrations/telegram/src/index.ts
@@ -1,9 +1,9 @@
+import { isOAuthWizardUrl } from '@botpress/common/src/oauth-wizard'
import { sentry as sentryHelpers } from '@botpress/sdk-addons'
import { ok } from 'assert/strict'
-
import { Telegraf } from 'telegraf'
import type { User } from 'telegraf/typings/core/types/typegram'
-
+import { getStoredBotToken } from './botToken'
import {
handleAudioMessage,
handleBlocMessage,
@@ -27,24 +27,28 @@ import {
getMessageId,
mapToRuntimeErrorAndThrow,
} from './misc/utils'
+import { handler as wizardHandler } from './wizard'
import * as bp from '.botpress'
const integration = new bp.Integration({
- register: async ({ webhookUrl, ctx }) => {
- const telegraf = new Telegraf(ctx.configuration.botToken)
+ register: async ({ webhookUrl, ctx, client }) => {
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
await telegraf.telegram
.setWebhook(webhookUrl)
.catch(mapToRuntimeErrorAndThrow('Fail to set webhook. Check your bot token'))
},
- unregister: async ({ ctx }) => {
- const telegraf = new Telegraf(ctx.configuration.botToken)
+ unregister: async ({ ctx, client }) => {
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
await telegraf.telegram
.deleteWebhook({ drop_pending_updates: true })
.catch(mapToRuntimeErrorAndThrow('Fail to delete webhook'))
},
actions: {
startTypingIndicator: async ({ input, ctx, client }) => {
- const telegraf = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const { conversation } = await client.getConversation({ id: input.conversationId })
const { message } = await client.getMessage({ id: input.messageId })
@@ -68,7 +72,8 @@ const integration = new bp.Integration({
return {}
}
- const telegraf = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const { conversation } = await client.getConversation({ id: input.conversationId })
const { message } = await client.getMessage({ id: input.messageId })
@@ -99,93 +104,105 @@ const integration = new bp.Integration({
},
},
},
- handler: wrapHandler(async ({ req, client, ctx, logger }) => {
- logger.forBot().debug('Handler received request from Telegram with payload:', req.body)
-
- ok(req.body, 'Handler received an empty body, so the message was ignored')
-
- const data = JSON.parse(req.body)
-
- ok(!data.my_chat_member, 'Handler received a chat member update, so the message was ignored')
- ok(!data.channel_post, 'Handler received a channel post, so the message was ignored')
- ok(!data.edited_channel_post, 'Handler received an edited channel post, so the message was ignored')
- ok(!data.edited_message, 'Handler received an edited message, so the message was ignored')
- ok(data.message, 'Handler received a non-message update, so the event was ignored')
-
- const message = data.message as TelegramMessage
- const telegramConversationId = message.chat.id
- const telegramUserId = message.from?.id
- const messageId = message.message_id
-
- ok(!message.from?.is_bot, 'Handler received a message from a bot, so the message was ignored')
- ok(telegramConversationId, 'Handler received message with empty "chat.id" value')
- ok(telegramUserId, 'Handler received message with empty "from.id" value')
- ok(messageId, 'Handler received an empty message id')
-
- const fromUser = message.from as User
- const userName = getUserNameFromTelegramUser(fromUser)
-
- const { conversation } = await client.getOrCreateConversation({
- channel: 'channel',
- tags: {
- id: telegramConversationId.toString(),
- fromUserId: telegramUserId.toString(),
- fromUserUsername: fromUser.username,
- fromUserName: userName,
- chatId: telegramConversationId.toString(),
- },
- discriminateByTags: ['id'],
- })
+ handler: async (props) => {
+ if (isOAuthWizardUrl(props.req.path)) {
+ return await wizardHandler(props)
+ }
- const { user } = await client.getOrCreateUser({
- tags: {
- id: telegramUserId.toString(),
- },
- ...(userName && { name: userName }),
- discriminateByTags: ['id'],
- })
-
- const userFieldsToUpdate = {
- pictureUrl: !user.pictureUrl
- ? await getUserPictureDataUri({
- botToken: ctx.configuration.botToken,
- telegramUserId,
- logger,
- })
- : undefined,
- name: user.name !== userName ? userName : undefined,
+ if (props.req.path.startsWith('/oauth')) {
+ return { status: 404, body: 'Not Found' }
}
- if (userFieldsToUpdate.pictureUrl || userFieldsToUpdate.name) {
- await client.updateUser({
- ...user,
+ return await wrapHandler(async ({ req, client, ctx, logger }) => {
+ logger.forBot().debug('Handler received request from Telegram with payload:', req.body)
+
+ ok(req.body, 'Handler received an empty body, so the message was ignored')
+
+ const data = JSON.parse(req.body)
+
+ ok(!data.my_chat_member, 'Handler received a chat member update, so the message was ignored')
+ ok(!data.channel_post, 'Handler received a channel post, so the message was ignored')
+ ok(!data.edited_channel_post, 'Handler received an edited channel post, so the message was ignored')
+ ok(!data.edited_message, 'Handler received an edited message, so the message was ignored')
+ ok(data.message, 'Handler received a non-message update, so the event was ignored')
+
+ const message = data.message as TelegramMessage
+ const telegramConversationId = message.chat.id
+ const telegramUserId = message.from?.id
+ const messageId = message.message_id
+
+ ok(!message.from?.is_bot, 'Handler received a message from a bot, so the message was ignored')
+ ok(telegramConversationId, 'Handler received message with empty "chat.id" value')
+ ok(telegramUserId, 'Handler received message with empty "from.id" value')
+ ok(messageId, 'Handler received an empty message id')
+
+ const fromUser = message.from as User
+ const userName = getUserNameFromTelegramUser(fromUser)
+
+ const { conversation } = await client.getOrCreateConversation({
+ channel: 'channel',
tags: {
- id: user.tags.id,
+ id: telegramConversationId.toString(),
+ fromUserId: telegramUserId.toString(),
+ fromUserUsername: fromUser.username,
+ fromUserName: userName,
+ chatId: telegramConversationId.toString(),
},
- ...(userFieldsToUpdate.pictureUrl && { pictureUrl: userFieldsToUpdate.pictureUrl }),
- ...(userFieldsToUpdate.name && { name: userFieldsToUpdate.name }),
+ discriminateByTags: ['id'],
})
- }
- const telegraf = new Telegraf(ctx.configuration.botToken)
- const bpMessage = await convertTelegramMessageToBotpressMessage({
- message,
- telegram: telegraf.telegram,
- logger,
- })
+ const { user } = await client.getOrCreateUser({
+ tags: {
+ id: telegramUserId.toString(),
+ },
+ ...(userName && { name: userName }),
+ discriminateByTags: ['id'],
+ })
- logger.forBot().debug(`Received message from user ${telegramUserId}: ${JSON.stringify(message, null, 2)}`)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+
+ const userFieldsToUpdate = {
+ pictureUrl: !user.pictureUrl
+ ? await getUserPictureDataUri({
+ botToken,
+ telegramUserId,
+ logger,
+ })
+ : undefined,
+ name: user.name !== userName ? userName : undefined,
+ }
- await client.createMessage({
- tags: {
- id: messageId.toString(),
- chatId: telegramConversationId.toString(),
- },
- ...bpMessage,
- userId: user.id,
- conversationId: conversation.id,
- })
- }),
+ if (userFieldsToUpdate.pictureUrl || userFieldsToUpdate.name) {
+ await client.updateUser({
+ ...user,
+ tags: {
+ id: user.tags.id,
+ },
+ ...(userFieldsToUpdate.pictureUrl && { pictureUrl: userFieldsToUpdate.pictureUrl }),
+ ...(userFieldsToUpdate.name && { name: userFieldsToUpdate.name }),
+ })
+ }
+
+ const telegraf = new Telegraf(botToken)
+ const bpMessage = await convertTelegramMessageToBotpressMessage({
+ message,
+ telegram: telegraf.telegram,
+ logger,
+ })
+
+ logger.forBot().debug(`Received message from user ${telegramUserId}: ${JSON.stringify(message, null, 2)}`)
+
+ await client.createMessage({
+ tags: {
+ id: messageId.toString(),
+ chatId: telegramConversationId.toString(),
+ },
+ ...bpMessage,
+ userId: user.id,
+ conversationId: conversation.id,
+ })
+ })(props)
+ },
})
export default sentryHelpers.wrapIntegration(integration, {
diff --git a/integrations/telegram/src/misc/message-handlers.ts b/integrations/telegram/src/misc/message-handlers.ts
index e49d1f5debf..9edd741fb5f 100644
--- a/integrations/telegram/src/misc/message-handlers.ts
+++ b/integrations/telegram/src/misc/message-handlers.ts
@@ -1,5 +1,6 @@
import { RuntimeError } from '@botpress/client'
import { Markup, Telegraf, Telegram } from 'telegraf'
+import { getStoredBotToken } from '../botToken'
import { markdownHtmlToTelegramPayloads, stdMarkdownToTelegramHtml } from './markdown-to-telegram-html'
import { TelegramMessage } from './types'
import { ackMessage, getChat, mapToRuntimeErrorAndThrow, sendCard } from './utils'
@@ -38,16 +39,17 @@ const sendContentOrFallback = async SendMediaMethod
fallback?: () => Promise
}) => {
- const { ctx, conversation, ack, logger, payload } = props
- const client = new Telegraf(ctx.configuration.botToken)
+ const { ctx, conversation, ack, logger, payload, client } = props
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
- const sendFn = send(client.telegram)
+ const sendFn = send(telegraf.telegram)
const opts = 'caption' in payload ? { caption: payload.caption } : undefined
logger.forBot().debug(`calling ${sendFn.name} to Telegram chat ${chat}: ${url}`)
let message: TelegramMessage
try {
message = await sendFn
- .call(client.telegram, chat, url, opts)
+ .call(telegraf.telegram, chat, url, opts)
.catch(mapToRuntimeErrorAndThrow(`Failed to ${sendFn.name}`))
} catch (err) {
if (fallback) {
@@ -60,7 +62,7 @@ const sendContentOrFallback = async ) => {
- const { payload, ctx, conversation, ack, logger } = props
+ const { payload, ctx, conversation, ack, logger, client } = props
const { text } = payload
- const client = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
logger.forBot().debug(`Sending markdown message to Telegram chat ${chat}:`, text)
const { html, extractedData } = stdMarkdownToTelegramHtml(text)
if (!extractedData.images || extractedData.images.length === 0) {
- await sendHtmlTextMessage(client, ack, chat, html)
+ await sendHtmlTextMessage(telegraf, ack, chat, html)
return
}
@@ -84,7 +87,7 @@ export const handleTextMessage = async (props: MessageHandlerProps<'text'>) => {
for (const payload of payloads) {
if (payload.type === 'text') {
- await sendHtmlTextMessage(client, ack, chat, payload.text)
+ await sendHtmlTextMessage(telegraf, ack, chat, payload.text)
} else {
await handleImageMessage({ ...props, payload: { imageUrl: payload.imageUrl }, type: 'image' })
}
@@ -136,24 +139,34 @@ export const handleLocationMessage = async ({
conversation,
ack,
logger,
+ client,
}: MessageHandlerProps<'location'>) => {
- const client = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
logger.forBot().debug(`Sending location message to Telegram chat ${chat}:`, {
latitude: payload.latitude,
longitude: payload.longitude,
})
- const message = await client.telegram
+ const message = await telegraf.telegram
.sendLocation(chat, payload.latitude, payload.longitude)
.catch(mapToRuntimeErrorAndThrow('Fail to send location'))
await ackMessage(message, ack)
}
-export const handleCardMessage = async ({ payload, ctx, conversation, ack, logger }: MessageHandlerProps<'card'>) => {
- const client = new Telegraf(ctx.configuration.botToken)
+export const handleCardMessage = async ({
+ payload,
+ ctx,
+ conversation,
+ ack,
+ logger,
+ client,
+}: MessageHandlerProps<'card'>) => {
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
logger.forBot().debug(`Sending card message to Telegram chat ${chat}:`, payload)
- await sendCard(payload, client, chat, ack)
+ await sendCard(payload, telegraf, chat, ack)
}
export const handleCarouselMessage = async ({
@@ -162,12 +175,14 @@ export const handleCarouselMessage = async ({
conversation,
ack,
logger,
+ client,
}: MessageHandlerProps<'carousel'>) => {
- const client = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
logger.forBot().debug(`Sending carousel message to Telegram chat ${chat}:`, payload)
for (const item of payload.items) {
- await sendCard(item, client, chat, ack)
+ await sendCard(item, telegraf, chat, ack)
}
}
@@ -177,12 +192,14 @@ export const handleDropdownMessage = async ({
conversation,
ack,
logger,
+ client,
}: MessageHandlerProps<'dropdown'>) => {
- const client = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
const buttons = payload.options.map((choice) => Markup.button.callback(choice.label, choice.value))
logger.forBot().debug(`Sending dropdown message to Telegram chat ${chat}:`, payload)
- const message = await client.telegram
+ const message = await telegraf.telegram
.sendMessage(chat, payload.text, Markup.keyboard(buttons).oneTime())
.catch(mapToRuntimeErrorAndThrow('Fail to send message'))
await ackMessage(message, ack)
@@ -194,12 +211,14 @@ export const handleChoiceMessage = async ({
conversation,
ack,
logger,
+ client,
}: MessageHandlerProps<'choice'>) => {
- const client = new Telegraf(ctx.configuration.botToken)
+ const botToken = await getStoredBotToken(client, ctx.integrationId, ctx.configuration.botToken)
+ const telegraf = new Telegraf(botToken)
const chat = getChat(conversation)
logger.forBot().debug(`Sending choice message to Telegram chat ${chat}:`, payload)
const buttons = payload.options.map((choice) => Markup.button.callback(choice.label, choice.value))
- const message = await client.telegram
+ const message = await telegraf.telegram
.sendMessage(chat, payload.text, Markup.keyboard(buttons).oneTime())
.catch(mapToRuntimeErrorAndThrow('Fail to send message'))
await ackMessage(message, ack)
diff --git a/integrations/telegram/src/wizard.ts b/integrations/telegram/src/wizard.ts
new file mode 100644
index 00000000000..e4c1cf1d0b2
--- /dev/null
+++ b/integrations/telegram/src/wizard.ts
@@ -0,0 +1,84 @@
+import * as oauthWizard from '@botpress/common/src/oauth-wizard'
+import { z } from '@botpress/sdk'
+import { Telegraf } from 'telegraf'
+import * as bp from '.botpress'
+
+type WizardHandler = oauthWizard.WizardStepHandler
+
+const _tokenSchema = z.object({
+ botToken: z.string().min(1).secret().title('Bot Token').describe('The bot token from @BotFather'),
+})
+
+const _tokenForm = {
+ pageTitle: 'Connect Telegram',
+ htmlOrMarkdownPageContents:
+ 'Paste the bot token from @BotFather.
' +
+ 'Create a new bot with the /newbot command if you do not have one yet.',
+ schema: _tokenSchema,
+ nextStepId: 'finalize',
+}
+
+export const handler = async (props: bp.HandlerProps) => {
+ const wizard = new oauthWizard.OAuthWizardBuilder(props)
+ .addStep({ id: 'start', handler: _startHandler })
+ .addStep({ id: 'finalize', handler: _finalizeHandler })
+ .build()
+
+ return await wizard.handleRequest()
+}
+
+const _startHandler: WizardHandler = ({ responses }) => {
+ return responses.displayForm(_tokenForm)
+}
+
+const _finalizeHandler: WizardHandler = async ({
+ formValues,
+ client,
+ ctx,
+ logger,
+ responses,
+ setIntegrationIdentifier,
+}) => {
+ if (!formValues) {
+ return responses.redirectToStep('start')
+ }
+
+ const parsed = _tokenSchema.safeParse(formValues)
+ if (!parsed.success) {
+ return responses.displayForm({
+ ..._tokenForm,
+ errors: parsed.error,
+ previousValues: formValues as z.input,
+ })
+ }
+
+ const { botToken } = parsed.data
+
+ let botUsername: string
+ try {
+ const telegraf = new Telegraf(botToken)
+ const bot = await telegraf.telegram.getMe()
+ botUsername = bot.username ?? String(bot.id)
+ } catch (thrown: unknown) {
+ const err = thrown instanceof Error ? thrown : new Error(String(thrown))
+ logger.forBot().debug('Token validation failed via getMe():', err)
+ return responses.displayForm({
+ ..._tokenForm,
+ // not a real ZodError instance, displayForm only reads errors.issues
+ errors: {
+ issues: [{ code: 'custom', path: ['botToken'], message: 'Invalid bot token. Please check and try again.' }],
+ } as unknown as z.ZodError>,
+ previousValues: { botToken },
+ })
+ }
+
+ await client.setState({
+ type: 'integration',
+ name: 'credentials',
+ id: ctx.integrationId,
+ payload: { botToken },
+ })
+
+ setIntegrationIdentifier(botUsername)
+ return responses.endWizard({ success: true })
+}
diff --git a/integrations/telegram/tsconfig.json b/integrations/telegram/tsconfig.json
index d46abc5b88f..4d1aa2db641 100644
--- a/integrations/telegram/tsconfig.json
+++ b/integrations/telegram/tsconfig.json
@@ -2,7 +2,9 @@
"extends": "../../tsconfig.json",
"compilerOptions": {
"paths": { "*": ["./*"] },
- "outDir": "dist"
+ "outDir": "dist",
+ "jsx": "react-jsx",
+ "jsxImportSource": "preact"
},
"include": [".botpress/**/*", "definitions/**/*", "src/**/*", "*.ts"]
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f85953bc7b0..038c178c658 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1224,10 +1224,10 @@ importers:
version: link:../../packages/cli
'@hey-api/client-fetch':
specifier: ^0.13.1
- version: 0.13.1(@hey-api/openapi-ts@0.97.1(typescript@5.9.3))
+ version: 0.13.1(@hey-api/openapi-ts@0.97.2(typescript@5.9.3))
'@hey-api/openapi-ts':
specifier: ^0.97.1
- version: 0.97.1(typescript@5.9.3)
+ version: 0.97.2(typescript@5.9.3)
'@types/node':
specifier: ^22.16.4
version: 22.16.4
@@ -1883,6 +1883,28 @@ importers:
specifier: ^14.1.2
version: 14.1.2
+ integrations/sharepoint:
+ dependencies:
+ '@azure/msal-node':
+ specifier: ^3.6.2
+ version: 3.6.3
+ '@botpress/common':
+ specifier: workspace:*
+ version: link:../../packages/common
+ '@botpress/sdk':
+ specifier: workspace:*
+ version: link:../../packages/sdk
+ axios:
+ specifier: ^1.10.0
+ version: 1.13.6
+ devDependencies:
+ '@botpress/cli':
+ specifier: workspace:*
+ version: link:../../packages/cli
+ '@sentry/cli':
+ specifier: ^2.39.1
+ version: 2.39.1
+
integrations/slack:
dependencies:
'@botpress/common':
@@ -5050,15 +5072,15 @@ packages:
resolution: {integrity: sha512-ZhCFSKI2ipZHEbgmtUHdyddvRU3wJ4elgCfYUC7T7hZa4EivSrVflTQf2w+v3TuaYxR1Y2V2kq3otqTttrrK8Q==}
engines: {node: '>=22.13.0'}
- '@hey-api/openapi-ts@0.97.1':
- resolution: {integrity: sha512-LksUJeXAqwf6OhcCCr3/B4YjnBs5rqSqjDUKMBvkgp4OhaCQiJrOvntctFxdnugy8jUojP4yi/eJf5xYzcYzCQ==}
+ '@hey-api/openapi-ts@0.97.2':
+ resolution: {integrity: sha512-nA+y0/I5O9loQMeJKumi6BQ40/Y71N0hIMmXZ/I7rh8jEOzYxSxmf5a4TBEI2Ap4RAfZyh7RJzJfVzT98KUYQQ==}
engines: {node: '>=22.13.0'}
hasBin: true
peerDependencies:
typescript: '>=5.5.3 || >=6.0.0 || 6.0.1-rc'
- '@hey-api/shared@0.4.3':
- resolution: {integrity: sha512-3tHfZNXgGOt+3P3Kq9cvqmZ9i7e3jtrkip1uDpZTX1+hTNboHhYdjxnT8AbrDuvslTaQHoAOlP4/iCDdzd9Jag==}
+ '@hey-api/shared@0.4.4':
+ resolution: {integrity: sha512-UZgaQNEdo/OSGLeNXhSv0VQTHQQm5Q2mHOuoYhFPJkNvLVrz7KZtGdKR8O4QPrhyblshxY+caJli08WKM0gREg==}
engines: {node: '>=22.13.0'}
'@hey-api/spec-types@0.2.0':
@@ -6759,6 +6781,9 @@ packages:
'@types/lodash@4.17.0':
resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==}
+ '@types/lodash@4.17.24':
+ resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==}
+
'@types/mailchimp__mailchimp_marketing@3.0.10':
resolution: {integrity: sha512-UMeHXH1XQUuj6PBWQzripZhH7ENEFMHiH55aGXKKuqhM29kF//xHWwqazY/zwT8TWKHvXAmIg/MKT8ZM1pFWrw==}
@@ -14778,9 +14803,9 @@ snapshots:
dependencies:
graphql: 15.8.0
- '@hey-api/client-fetch@0.13.1(@hey-api/openapi-ts@0.97.1(typescript@5.9.3))':
+ '@hey-api/client-fetch@0.13.1(@hey-api/openapi-ts@0.97.2(typescript@5.9.3))':
dependencies:
- '@hey-api/openapi-ts': 0.97.1(typescript@5.9.3)
+ '@hey-api/openapi-ts': 0.97.2(typescript@5.9.3)
'@hey-api/codegen-core@0.8.1':
dependencies:
@@ -14797,11 +14822,11 @@ snapshots:
'@types/json-schema': 7.0.15
js-yaml: 4.1.1
- '@hey-api/openapi-ts@0.97.1(typescript@5.9.3)':
+ '@hey-api/openapi-ts@0.97.2(typescript@5.9.3)':
dependencies:
'@hey-api/codegen-core': 0.8.1
'@hey-api/json-schema-ref-parser': 1.4.2
- '@hey-api/shared': 0.4.3
+ '@hey-api/shared': 0.4.4
'@hey-api/spec-types': 0.2.0
'@hey-api/types': 0.1.4
'@lukeed/ms': 2.0.2
@@ -14813,7 +14838,7 @@ snapshots:
transitivePeerDependencies:
- magicast
- '@hey-api/shared@0.4.3':
+ '@hey-api/shared@0.4.4':
dependencies:
'@hey-api/codegen-core': 0.8.1
'@hey-api/json-schema-ref-parser': 1.4.2
@@ -16962,12 +16987,14 @@ snapshots:
'@types/lodash-es@4.17.12':
dependencies:
- '@types/lodash': 4.17.0
+ '@types/lodash': 4.17.24
'@types/lodash@4.14.195': {}
'@types/lodash@4.17.0': {}
+ '@types/lodash@4.17.24': {}
+
'@types/mailchimp__mailchimp_marketing@3.0.10': {}
'@types/markdown-it@14.1.2':
@@ -17179,7 +17206,7 @@ snapshots:
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.7.4
+ semver: 7.7.2
ts-api-utils: 2.1.0(typescript@5.6.3)
typescript: 5.6.3
transitivePeerDependencies:
@@ -18683,7 +18710,7 @@ snapshots:
'@one-ini/wasm': 0.1.1
commander: 10.0.1
minimatch: 9.0.1
- semver: 7.7.4
+ semver: 7.7.2
ee-first@1.1.1: {}
@@ -19887,7 +19914,7 @@ snapshots:
extend: 3.0.2
gaxios: 5.1.0
google-auth-library: 8.8.0
- qs: 6.15.0
+ qs: 6.13.0
url-template: 2.0.8
uuid: 9.0.1
transitivePeerDependencies:
@@ -19899,7 +19926,7 @@ snapshots:
extend: 3.0.2
gaxios: 6.1.1
google-auth-library: 9.0.0
- qs: 6.15.0
+ qs: 6.13.0
url-template: 2.0.8
uuid: 9.0.1
transitivePeerDependencies:
@@ -20757,7 +20784,7 @@ snapshots:
jest-util: 29.5.0
natural-compare: 1.4.0
pretty-format: 29.5.0
- semver: 7.7.4
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color
@@ -20942,7 +20969,7 @@ snapshots:
dependencies:
'@bcherny/json-schema-ref-parser': 10.0.5-fork
'@types/json-schema': 7.0.15
- '@types/lodash': 4.17.0
+ '@types/lodash': 4.17.24
'@types/prettier': 2.7.3
cli-color: 2.0.3
get-stdin: 8.0.0
@@ -21521,7 +21548,7 @@ snapshots:
messaging-api-common@1.0.4:
dependencies:
'@types/debug': 4.1.12
- '@types/lodash': 4.17.0
+ '@types/lodash': 4.17.24
'@types/url-join': 4.0.3
axios: 0.21.4(debug@4.4.1)
camel-case: 4.1.2
@@ -23416,7 +23443,7 @@ snapshots:
formidable: 1.2.6
methods: 1.1.2
mime: 1.6.0
- qs: 6.15.0
+ qs: 6.13.0
readable-stream: 2.3.8
transitivePeerDependencies:
- supports-color
@@ -23433,7 +23460,7 @@ snapshots:
mime: 2.6.0
qs: 6.15.0
readable-stream: 3.6.2
- semver: 7.7.4
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color
@@ -23449,7 +23476,7 @@ snapshots:
mime: 2.6.0
qs: 6.15.0
readable-stream: 3.6.2
- semver: 7.7.4
+ semver: 7.7.2
transitivePeerDependencies:
- supports-color