2
0

🚑 (bot) Fix set variable number computation

This commit is contained in:
Baptiste Arnaud
2022-10-17 22:36:53 +02:00
parent 9cb7f8cd96
commit 7b0bd08dc8
4 changed files with 119 additions and 66 deletions

View File

@ -20,7 +20,7 @@ import {
} from 'models'
import { byId, isDefined, isNotDefined, sendRequest } from 'utils'
import { sanitizeUrl } from './utils'
import { evaluateExpression, parseVariables } from './variable'
import { parseCorrectValueType, parseVariables } from './variable'
type EdgeId = string
@ -69,7 +69,9 @@ const executeSetVariable = (
): EdgeId | undefined => {
if (!block.options?.variableId) return block.outgoingEdgeId
const evaluatedExpression = block.options.expressionToEvaluate
? evaluateExpression(variables)(block.options.expressionToEvaluate)
? evaluateSetVariableExpression(variables)(
block.options.expressionToEvaluate
)
: undefined
const existingVariable = variables.find(byId(block.options.variableId))
if (!existingVariable) return block.outgoingEdgeId
@ -78,6 +80,21 @@ const executeSetVariable = (
return block.outgoingEdgeId
}
const evaluateSetVariableExpression =
(variables: Variable[]) =>
(str: string): unknown => {
const evaluating = parseVariables(variables, { fieldToParse: 'id' })(
str.includes('return ') ? str : `return ${str}`
)
try {
const func = Function(...variables.map((v) => v.id), evaluating)
return func(...variables.map((v) => parseCorrectValueType(v.value)))
} catch (err) {
console.log(`Evaluating: ${evaluating}`, err)
return str
}
}
const executeCondition = (
block: ConditionBlock,
{ typebot: { variables } }: LogicContext
@ -161,7 +178,7 @@ const executeCode = async (
parseVariables(variables, { fieldToParse: 'id' })(block.options.content)
)
try {
await func(...variables.map((v) => v.value))
await func(...variables.map((v) => parseCorrectValueType(v.value)))
} catch (err) {
console.error(err)
}

View File

@ -41,27 +41,30 @@ export const safeStringify = (val: unknown): string | null => {
}
}
export const parseCorrectValueType = (
value: Variable['value']
): string | boolean | number | null | undefined => {
if (value === null) return null
if (value === undefined) return undefined
const isNumberStartingWithZero =
value.startsWith('0') && !value.startsWith('0.') && value.length > 1
if (typeof value === 'string' && isNumberStartingWithZero) return value
if (typeof value === 'number') return value
if (value === 'true') return true
if (value === 'false') return false
if (value === 'null') return null
if (value === 'undefined') return undefined
// isNaN works with strings
if (isNaN(value as unknown as number)) return value
return Number(value)
}
const jsonParse = (str: string) =>
str
.replace(/\n/g, `\\n`)
.replace(/"/g, `\\"`)
.replace(/\\[^n"]/g, `\\\\ `)
export const evaluateExpression =
(variables: Variable[]) =>
(str: string): unknown => {
const evaluating = parseVariables(variables, { fieldToParse: 'id' })(
str.includes('return ') ? str : `return ${str}`
)
try {
const func = Function(...variables.map((v) => v.id), evaluating)
return func(...variables.map((v) => v.value))
} catch (err) {
console.log(`Evaluating: ${evaluating}`, err)
return str
}
}
export const parseVariablesInObject = (
object: { [key: string]: string | number },
variables: Variable[]