diff --git a/apps/viewer/package.json b/apps/viewer/package.json index 187a8dc77..c1f287a14 100644 --- a/apps/viewer/package.json +++ b/apps/viewer/package.json @@ -29,6 +29,7 @@ "libphonenumber-js": "1.10.30", "next": "13.4.3", "nextjs-cors": "2.1.2", + "node-html-parser": "^6.1.5", "nodemailer": "6.9.2", "openai": "3.2.1", "openai-edge": "^1.1.0", diff --git a/apps/viewer/src/features/chat/api/sendMessage.ts b/apps/viewer/src/features/chat/api/sendMessage.ts index 079fa994f..231bf4a52 100644 --- a/apps/viewer/src/features/chat/api/sendMessage.ts +++ b/apps/viewer/src/features/chat/api/sendMessage.ts @@ -25,12 +25,13 @@ import { setResultAsCompleted, startBotFlow, } from '../helpers' -import { env, isDefined, omit } from '@typebot.io/lib' +import { env, isDefined, isNotEmpty, omit } from '@typebot.io/lib' import { prefillVariables } from '@/features/variables/prefillVariables' import { injectVariablesFromExistingResult } from '@/features/variables/injectVariablesFromExistingResult' import { deepParseVariables } from '@/features/variables/deepParseVariable' import { parseVariables } from '@/features/variables/parseVariables' import { saveLog } from '@/features/logs/saveLog' +import { NodeType, parse } from 'node-html-parser' export const sendMessage = publicProcedure .meta({ @@ -448,7 +449,9 @@ const parseStartClientSideAction = ( ): NonNullable[number] | undefined => { const blocks = typebot.groups.flatMap((group) => group.blocks) const startPropsToInject = { - customHeadCode: typebot.settings.metadata.customHeadCode, + customHeadCode: isNotEmpty(typebot.settings.metadata.customHeadCode) + ? parseHeadCode(typebot.settings.metadata.customHeadCode) + : undefined, gtmId: typebot.settings.metadata.googleTagManagerId, googleAnalyticsId: ( blocks.find( @@ -479,3 +482,33 @@ const parseStartClientSideAction = ( startPropsToInject, } } + +const parseHeadCode = (code: string) => { + code = injectTryCatch(code) + return parse(code) + .childNodes.filter((child) => child.nodeType !== NodeType.TEXT_NODE) + .join('\n') +} + +const injectTryCatch = (headCode: string) => { + const scriptTagRegex = /)<[^<]*)*<\/script>/gi + const scriptTags = headCode.match(scriptTagRegex) + if (scriptTags) { + scriptTags.forEach(function (tag) { + const wrappedTag = tag.replace( + /(]*>)([\s\S]*?)(<\/script>)/gi, + function (_, openingTag, content, closingTag) { + return `${openingTag} +try { + ${content} +} catch (e) { + console.warn(e); +} +${closingTag}` + } + ) + headCode = headCode.replace(tag, wrappedTag) + }) + } + return headCode +} diff --git a/packages/embeds/js/package.json b/packages/embeds/js/package.json index 4a9b19a39..3071bfc51 100644 --- a/packages/embeds/js/package.json +++ b/packages/embeds/js/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/js", - "version": "0.0.73", + "version": "0.0.74", "description": "Javascript library to display typebots on your website", "type": "module", "main": "dist/index.js", diff --git a/packages/embeds/react/package.json b/packages/embeds/react/package.json index e911609ed..7583d594d 100644 --- a/packages/embeds/react/package.json +++ b/packages/embeds/react/package.json @@ -1,6 +1,6 @@ { "name": "@typebot.io/react", - "version": "0.0.73", + "version": "0.0.74", "description": "React library to display typebots on your website", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/lib/utils.ts b/packages/lib/utils.ts index 044c2c1c5..fec1e9ee5 100644 --- a/packages/lib/utils.ts +++ b/packages/lib/utils.ts @@ -287,7 +287,6 @@ export const parseNumberWithCommas = (num: number) => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') export const injectCustomHeadCode = (customHeadCode: string) => { - customHeadCode = injectTryCatch(customHeadCode) const headCodes = customHeadCode.split('') headCodes.forEach((headCode) => { const [codeToInject, noScriptContentToInject] = headCode.split('