🐛 (engine) Sanitize variable value before saving to avoid db insert failure

This commit is contained in:
Baptiste Arnaud 2025-05-28 17:01:24 +02:00
parent 4e9d4fce0a
commit b041842e4a
No known key found for this signature in database

View File

@ -71,8 +71,10 @@ const updateTypebotVariables = ({
const serializedNewVariables = newVariables.map((variable) => ({
...variable,
value: Array.isArray(variable.value)
? variable.value.map(safeStringify)
: safeStringify(variable.value),
? variable.value.map((value) =>
sanitizeNewVariableValue(safeStringify(value)),
)
: sanitizeNewVariableValue(safeStringify(variable.value)),
}));
let setVariableHistoryIndex = state.currentSetVariableHistoryIndex ?? 0;
@ -106,3 +108,19 @@ const updateTypebotVariables = ({
setVariableHistoryIndex,
};
};
const sanitizeNewVariableValue = (value: string | null): string | null =>
value ? sanitizeString(value) : null;
export const sanitizeString = (input: string): string => {
// 1. Replace unpaired surrogate halves with <20>
let output = input.replace(
/([\uD800-\uDBFF](?![\uDC00-\uDFFF]))|((?<![\uD800-\uDBFF])[\uDC00-\uDFFF])/g,
"<22>",
);
// 2. Escape lone backslashes that could break downstream JSON parsing
output = output.replace(/\\(?![\\ntbrf"'u])/g, "\\\\");
return output;
};