interface SQLInsertGenReturn { query: string; values: string[]; } type DataFn = () => { placeholder: string; value: string | number | Float32Array; }; type DataType = { [k: string]: string | number | DataFn | undefined | null }; type Params = { data: DataType[]; tableName: string; dbFullName?: string; }; /** * # SQL Insert Generator */ export default function sqlInsertGenerator({ tableName, data, dbFullName, }: Params): SQLInsertGenReturn | undefined { const finalDbName = dbFullName ? `${dbFullName}.` : ""; try { if (Array.isArray(data) && data?.[0]) { let insertKeys: string[] = []; data.forEach((dt) => { const kys = Object.keys(dt); kys.forEach((ky) => { if (!insertKeys.includes(ky)) { insertKeys.push(ky); } }); }); let queryBatches: string[] = []; let queryValues: string[] = []; data.forEach((item) => { queryBatches.push( `(${insertKeys .map((ky) => { const value = item[ky]; const finalValue = typeof value == "string" || typeof value == "number" ? String(value) : value ? String(value().value) : null; if (!finalValue) { return undefined; } queryValues.push(finalValue); const placeholder = typeof value == "function" ? value().placeholder : "?"; return placeholder; }) .filter((k) => Boolean(k)) .join(",")})`, ); }); let query = `INSERT INTO ${finalDbName}${tableName} (${insertKeys.join( ",", )}) VALUES ${queryBatches.join(",")}`; return { query: query, values: queryValues, }; } else { return undefined; } } catch (/** @type {any} */ error: any) { console.log(`SQL insert gen ERROR: ${error.message}`); return undefined; } }