2023-03-15 12:21:52 +01:00
|
|
|
import { isDefined } from '@typebot.io/lib'
|
|
|
|
|
import { Variable, VariableWithValue } from '@typebot.io/schemas'
|
|
|
|
|
import { safeStringify } from './safeStringify'
|
|
|
|
|
|
2023-03-15 17:47:05 +01:00
|
|
|
export type ParseVariablesOptions = {
|
|
|
|
|
fieldToParse?: 'value' | 'id'
|
|
|
|
|
escapeForJson?: boolean
|
|
|
|
|
takeLatestIfList?: boolean
|
2023-04-17 15:54:52 +02:00
|
|
|
escapeHtml?: boolean
|
2023-03-15 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const defaultParseVariablesOptions: ParseVariablesOptions = {
|
|
|
|
|
fieldToParse: 'value',
|
|
|
|
|
escapeForJson: false,
|
|
|
|
|
takeLatestIfList: false,
|
2023-04-17 15:54:52 +02:00
|
|
|
escapeHtml: false,
|
2023-03-15 17:47:05 +01:00
|
|
|
}
|
|
|
|
|
|
2023-03-15 12:21:52 +01:00
|
|
|
export const parseVariables =
|
|
|
|
|
(
|
|
|
|
|
variables: Variable[],
|
2023-03-15 17:47:05 +01:00
|
|
|
options: ParseVariablesOptions = defaultParseVariablesOptions
|
2023-03-15 12:21:52 +01:00
|
|
|
) =>
|
|
|
|
|
(text: string | undefined): string => {
|
|
|
|
|
if (!text || text === '') return ''
|
2023-03-23 18:32:12 +01:00
|
|
|
// Capture {{variable}} and ${{{variable}}} (variables in template litterals)
|
2023-03-24 07:42:17 +01:00
|
|
|
const pattern = /\{\{([^{}]+)\}\}|(\$)\{\{([^{}]+)\}\}/g
|
2023-03-23 18:32:12 +01:00
|
|
|
return text.replace(
|
|
|
|
|
pattern,
|
2023-03-24 07:42:17 +01:00
|
|
|
(_full, nameInCurlyBraces, _dollarSign, nameInTemplateLitteral) => {
|
|
|
|
|
const dollarSign = _dollarSign ?? ''
|
2023-03-23 18:32:12 +01:00
|
|
|
const matchedVarName = nameInCurlyBraces ?? nameInTemplateLitteral
|
|
|
|
|
const variable = variables.find((variable) => {
|
|
|
|
|
return (
|
|
|
|
|
matchedVarName === variable.name &&
|
|
|
|
|
(options.fieldToParse === 'id' || isDefined(variable.value))
|
|
|
|
|
)
|
|
|
|
|
}) as VariableWithValue | undefined
|
2023-03-24 07:42:17 +01:00
|
|
|
if (!variable) return dollarSign + ''
|
|
|
|
|
if (options.fieldToParse === 'id') return dollarSign + variable.id
|
2023-03-23 18:32:12 +01:00
|
|
|
const { value } = variable
|
|
|
|
|
if (options.escapeForJson)
|
2023-03-24 07:42:17 +01:00
|
|
|
return (
|
|
|
|
|
dollarSign +
|
|
|
|
|
jsonParse(typeof value !== 'string' ? JSON.stringify(value) : value)
|
|
|
|
|
)
|
|
|
|
|
const parsedValue =
|
|
|
|
|
dollarSign +
|
|
|
|
|
safeStringify(
|
|
|
|
|
options.takeLatestIfList && Array.isArray(value)
|
|
|
|
|
? value[value.length - 1]
|
|
|
|
|
: value
|
2023-03-23 18:32:12 +01:00
|
|
|
)
|
2023-03-24 07:42:17 +01:00
|
|
|
if (!parsedValue) return dollarSign + ''
|
2023-04-17 15:54:52 +02:00
|
|
|
if (options.escapeHtml)
|
|
|
|
|
return parsedValue.replace(/</g, '<').replace(/>/g, '>')
|
2023-03-23 18:32:12 +01:00
|
|
|
return parsedValue
|
|
|
|
|
}
|
|
|
|
|
)
|
2023-03-15 12:21:52 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const jsonParse = (str: string) =>
|
|
|
|
|
str
|
|
|
|
|
.replace(/\n/g, `\\n`)
|
|
|
|
|
.replace(/"/g, `\\"`)
|
|
|
|
|
.replace(/\\[^n"]/g, `\\\\ `)
|