function isTextField(field) { if (!field || field.isVector) return false; return /char|text|enum|set|json/i.test(String(field.dataType || "")); } /** * Map a JS value to a bound parameter + placeholder for INSERT / UPDATE. * * - `false` / `true` -> `0` / `1` * - number arrays (embeddings) -> `VEC_FromText(?)` with a JSON string * - `{ value, placeholder }` factories are called once * - `""` stays `""` for text columns and becomes `NULL` for everything else * (e.g. the `number | ""` typedefs for numeric columns) */ export default function sqlValuePlaceholder({ value, field, }) { if (typeof value == "function") { const fnValue = value(); return { placeholder: fnValue?.placeholder || "?", value: fnValue?.value ?? null, }; } if (typeof value == "boolean") { return { placeholder: "?", value: value ? 1 : 0 }; } if (value === undefined || value === null) { return { placeholder: "?", value: null }; } if (value === "") { return { placeholder: "?", value: isTextField(field) ? "" : null }; } if (Array.isArray(value) && typeof value[0] == "number") { return { placeholder: "VEC_FromText(?)", value: JSON.stringify(value) }; } return { placeholder: "?", value }; }