✨ (credentials) Add credentials management menu in workspace settings
Closes #1567
This commit is contained in:
@ -335,8 +335,8 @@ export const convertKeyValueTableToObject = (
|
||||
const value = parseVariables(variables)(item.value)
|
||||
if (isEmpty(key) || isEmpty(value)) return object
|
||||
if (object[key] && concatDuplicateInArray) {
|
||||
if (Array.isArray(object[key])) object[key].push(value)
|
||||
else object[key] = [object[key], value]
|
||||
if (Array.isArray(object[key])) (object[key] as string[]).push(value)
|
||||
else object[key] = [object[key] as string, value]
|
||||
} else object[key] = value
|
||||
return object
|
||||
}, {})
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { anthropicBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const anthropicBlockSchema = parseBlockSchema(anthropicBlock)
|
||||
export const anthropicCredentialsSchema = parseBlockCredentials(anthropicBlock)
|
||||
export const anthropicCredentialsSchema = parseBlockCredentials(
|
||||
anthropicBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,5 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { parseBlockSchema } from '@typebot.io/forge'
|
||||
import { calComBlock } from '.'
|
||||
|
||||
export const calComBlockSchema = parseBlockSchema(calComBlock)
|
||||
export const calComCredentialsSchema = parseBlockCredentials(calComBlock)
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { chatNodeBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const chatNodeBlockSchema = parseBlockSchema(chatNodeBlock)
|
||||
export const chatNodeCredentialsSchema = parseBlockCredentials(chatNodeBlock)
|
||||
export const chatNodeCredentialsSchema = parseBlockCredentials(
|
||||
chatNodeBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { difyAiBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const difyAiBlockSchema = parseBlockSchema(difyAiBlock)
|
||||
export const difyAiCredentialsSchema = parseBlockCredentials(difyAiBlock)
|
||||
export const difyAiCredentialsSchema = parseBlockCredentials(
|
||||
difyAiBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,7 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { elevenlabsBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const elevenlabsBlockSchema = parseBlockSchema(elevenlabsBlock)
|
||||
export const elevenlabsCredentialsSchema =
|
||||
parseBlockCredentials(elevenlabsBlock)
|
||||
export const elevenlabsCredentialsSchema = parseBlockCredentials(
|
||||
elevenlabsBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { mistralBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const mistralBlockSchema = parseBlockSchema(mistralBlock)
|
||||
export const mistralCredentialsSchema = parseBlockCredentials(mistralBlock)
|
||||
export const mistralCredentialsSchema = parseBlockCredentials(
|
||||
mistralBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { nocodbBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const nocodbBlockSchema = parseBlockSchema(nocodbBlock)
|
||||
export const nocodbCredentialsSchema = parseBlockCredentials(nocodbBlock)
|
||||
export const nocodbCredentialsSchema = parseBlockCredentials(
|
||||
nocodbBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,7 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { openRouterBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const openRouterBlockSchema = parseBlockSchema(openRouterBlock)
|
||||
export const openRouterCredentialsSchema =
|
||||
parseBlockCredentials(openRouterBlock)
|
||||
export const openRouterCredentialsSchema = parseBlockCredentials(
|
||||
openRouterBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { openAIBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const openAIBlockSchema = parseBlockSchema(openAIBlock)
|
||||
export const openAICredentialsSchema = parseBlockCredentials(openAIBlock)
|
||||
export const openAICredentialsSchema = parseBlockCredentials(
|
||||
openAIBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,6 +1,5 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { parseBlockSchema } from '@typebot.io/forge'
|
||||
import { qrCodeBlock } from '.'
|
||||
|
||||
export const qrCodeBlockSchema = parseBlockSchema(qrCodeBlock)
|
||||
export const qrCodeCredentialsSchema = parseBlockCredentials(qrCodeBlock)
|
||||
|
@ -1,7 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { togetherAiBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const togetherAiBlockSchema = parseBlockSchema(togetherAiBlock)
|
||||
export const togetherAiCredentialsSchema =
|
||||
parseBlockCredentials(togetherAiBlock)
|
||||
export const togetherAiCredentialsSchema = parseBlockCredentials(
|
||||
togetherAiBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -1,7 +1,10 @@
|
||||
// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { zemanticAiBlock } from '.'
|
||||
import { auth } from './auth'
|
||||
|
||||
export const zemanticAiBlockSchema = parseBlockSchema(zemanticAiBlock)
|
||||
export const zemanticAiCredentialsSchema =
|
||||
parseBlockCredentials(zemanticAiBlock)
|
||||
export const zemanticAiCredentialsSchema = parseBlockCredentials(
|
||||
zemanticAiBlock.id,
|
||||
auth.schema
|
||||
)
|
||||
|
@ -273,6 +273,7 @@ const createSchemasFile = async (
|
||||
path: string,
|
||||
{
|
||||
id,
|
||||
auth,
|
||||
}: { id: string; name: string; auth: 'apiKey' | 'encryptedData' | 'none' }
|
||||
) => {
|
||||
const camelCaseName = camelize(id as string)
|
||||
@ -280,11 +281,19 @@ const createSchemasFile = async (
|
||||
join(path, 'schemas.ts'),
|
||||
await prettier.format(
|
||||
`// Do not edit this file manually
|
||||
import { parseBlockCredentials, parseBlockSchema } from '@typebot.io/forge'
|
||||
import { ${camelCaseName}Block } from '.'
|
||||
import { ${
|
||||
auth !== 'none' ? 'parseBlockCredentials,' : ''
|
||||
} parseBlockSchema } from '@typebot.io/forge'
|
||||
import { ${camelCaseName}Block } from '.'${
|
||||
auth !== 'none' ? `\nimport { auth } from './auth'` : ''
|
||||
}
|
||||
|
||||
export const ${camelCaseName}BlockSchema = parseBlockSchema(${camelCaseName}Block)
|
||||
export const ${camelCaseName}CredentialsSchema = parseBlockCredentials(${camelCaseName}Block)`,
|
||||
${
|
||||
auth !== 'none'
|
||||
? `export const ${camelCaseName}CredentialsSchema = parseBlockCredentials(${camelCaseName}Block.id, auth.schema)`
|
||||
: ''
|
||||
}`,
|
||||
{ parser: 'typescript', ...prettierRc }
|
||||
)
|
||||
)
|
||||
|
@ -82,22 +82,18 @@ export const parseBlockSchema = <
|
||||
})
|
||||
}
|
||||
|
||||
export const parseBlockCredentials = <
|
||||
I extends string,
|
||||
A extends AuthDefinition,
|
||||
O extends z.ZodObject<any>
|
||||
>(
|
||||
blockDefinition: BlockDefinition<I, A, O>
|
||||
export const parseBlockCredentials = <I extends string>(
|
||||
blockId: I,
|
||||
authSchema: z.ZodObject<any>
|
||||
) => {
|
||||
if (!blockDefinition.auth) return null
|
||||
return z.object({
|
||||
id: z.string(),
|
||||
type: z.literal(blockDefinition.id),
|
||||
type: z.literal(blockId),
|
||||
createdAt: z.date(),
|
||||
workspaceId: z.string(),
|
||||
name: z.string(),
|
||||
iv: z.string(),
|
||||
data: blockDefinition.auth.schema,
|
||||
data: authSchema,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,5 @@
|
||||
import { anthropicBlock } from '@typebot.io/anthropic-block'
|
||||
import { anthropicCredentialsSchema } from '@typebot.io/anthropic-block/schemas'
|
||||
import { calComBlock } from '@typebot.io/cal-com-block'
|
||||
import { calComCredentialsSchema } from '@typebot.io/cal-com-block/schemas'
|
||||
import { chatNodeBlock } from '@typebot.io/chat-node-block'
|
||||
import { chatNodeCredentialsSchema } from '@typebot.io/chat-node-block/schemas'
|
||||
import { difyAiBlock } from '@typebot.io/dify-ai-block'
|
||||
@ -14,8 +12,6 @@ import { openRouterBlock } from '@typebot.io/open-router-block'
|
||||
import { openRouterCredentialsSchema } from '@typebot.io/open-router-block/schemas'
|
||||
import { openAIBlock } from '@typebot.io/openai-block'
|
||||
import { openAICredentialsSchema } from '@typebot.io/openai-block/schemas'
|
||||
import { qrCodeBlock } from '@typebot.io/qrcode-block'
|
||||
import { qrCodeCredentialsSchema } from '@typebot.io/qrcode-block/schemas'
|
||||
import { togetherAiBlock } from '@typebot.io/together-ai-block'
|
||||
import { togetherAiCredentialsSchema } from '@typebot.io/together-ai-block/schemas'
|
||||
import { zemanticAiBlock } from '@typebot.io/zemantic-ai-block'
|
||||
@ -26,9 +22,7 @@ import { nocodbCredentialsSchema } from '@typebot.io/nocodb-block/schemas'
|
||||
export const forgedCredentialsSchemas = {
|
||||
[openAIBlock.id]: openAICredentialsSchema,
|
||||
[zemanticAiBlock.id]: zemanticAiCredentialsSchema,
|
||||
[calComBlock.id]: calComCredentialsSchema,
|
||||
[chatNodeBlock.id]: chatNodeCredentialsSchema,
|
||||
[qrCodeBlock.id]: qrCodeCredentialsSchema,
|
||||
[difyAiBlock.id]: difyAiCredentialsSchema,
|
||||
[mistralBlock.id]: mistralCredentialsSchema,
|
||||
[elevenlabsBlock.id]: elevenlabsCredentialsSchema,
|
||||
|
@ -7,7 +7,7 @@
|
||||
"types": "./index.ts",
|
||||
"devDependencies": {
|
||||
"@paralleldrive/cuid2": "2.2.1",
|
||||
"@playwright/test": "1.43.1",
|
||||
"@playwright/test": "1.45.2",
|
||||
"@typebot.io/env": "workspace:*",
|
||||
"@typebot.io/prisma": "workspace:*",
|
||||
"@typebot.io/tsconfig": "workspace:*",
|
||||
@ -49,4 +49,4 @@
|
||||
"wildcard-match": "5.1.3",
|
||||
"zod": "3.22.4"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -151,25 +151,6 @@ export const updateUser = (data: Partial<User>) =>
|
||||
},
|
||||
})
|
||||
|
||||
export const createWebhook = async (
|
||||
typebotId: string,
|
||||
webhookProps?: Partial<HttpRequest>
|
||||
) => {
|
||||
try {
|
||||
await prisma.webhook.delete({ where: { id: 'webhook1' } })
|
||||
} catch {}
|
||||
return prisma.webhook.create({
|
||||
data: {
|
||||
method: 'GET',
|
||||
typebotId,
|
||||
id: 'webhook1',
|
||||
...webhookProps,
|
||||
queryParams: webhookProps?.queryParams ?? [],
|
||||
headers: webhookProps?.headers ?? [],
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
export const createTypebots = async (partialTypebots: Partial<TypebotV6>[]) => {
|
||||
const typebotsWithId = partialTypebots.map((typebot) => {
|
||||
const typebotId = typebot.id ?? createId()
|
||||
|
@ -7,7 +7,7 @@
|
||||
"author": "Baptiste Arnaud",
|
||||
"license": "AGPL-3.0-or-later",
|
||||
"dependencies": {
|
||||
"@playwright/test": "1.43.1",
|
||||
"@playwright/test": "1.45.2",
|
||||
"@typebot.io/lib": "workspace:*",
|
||||
"@typebot.io/prisma": "workspace:*",
|
||||
"@typebot.io/schemas": "workspace:*",
|
||||
|
@ -3,16 +3,26 @@ import { stripeCredentialsSchema } from './blocks/inputs/payment/schema'
|
||||
import { googleSheetsCredentialsSchema } from './blocks/integrations/googleSheets/schema'
|
||||
import { smtpCredentialsSchema } from './blocks/integrations/sendEmail'
|
||||
import { whatsAppCredentialsSchema } from './whatsapp'
|
||||
import { zemanticAiCredentialsSchema } from './blocks'
|
||||
import { openAICredentialsSchema } from './blocks/integrations/openai'
|
||||
import { forgedCredentialsSchemas } from '@typebot.io/forge-repository/credentials'
|
||||
|
||||
export const credentialsSchema = z.discriminatedUnion('type', [
|
||||
const credentialsSchema = z.discriminatedUnion('type', [
|
||||
smtpCredentialsSchema,
|
||||
googleSheetsCredentialsSchema,
|
||||
stripeCredentialsSchema,
|
||||
openAICredentialsSchema,
|
||||
whatsAppCredentialsSchema,
|
||||
zemanticAiCredentialsSchema,
|
||||
...Object.values(forgedCredentialsSchemas),
|
||||
])
|
||||
|
||||
export type Credentials = z.infer<typeof credentialsSchema>
|
||||
|
||||
export const credentialsTypes = [
|
||||
'smtp',
|
||||
'google sheets',
|
||||
'stripe',
|
||||
'whatsApp',
|
||||
...(Object.keys(forgedCredentialsSchemas) as Array<
|
||||
keyof typeof forgedCredentialsSchemas
|
||||
>),
|
||||
] as const
|
||||
|
||||
export const credentialsTypeSchema = z.enum(credentialsTypes)
|
||||
|
Reference in New Issue
Block a user